python
def get_repo_path(file_path: str) -> Path:
"""Resolve repo path, ensuring it stays inside REPO_ROOT."""
# Prevent path traversal
normalized = os.path.normpath(file_path)
if normalized.startswith("..") or os.path.isabs(normalized):
raise HTTPException(status_code=403, detail="Forbidden")
target = (REPO_ROOT / normalized).resolve()
# security check
try:
target.relative_to(REPO_ROOT.resolve())
except ValueError:
raise HTTPException(status_code=403, detail="Forbidden")
return target
最近在用ai写代码,发现它写的一个限制访问路径的方法,挺有意思的(如上代码)。
这个函数的作用
这个函数是Web 服务里的安全防护函数,核心只有一件事:
只允许用户访问项目根目录(REPO_ROOT)内部的文件,绝对禁止访问外面的任何文件。
这是为了防止黑客做 路径遍历攻击(Path Traversal Attack) 。
比如黑客传一个路径:
../../etc/passwd
想偷看你服务器的系统文件,这个函数会直接拒绝,返回 403 禁止访问。
函数执行步骤(简单版)
- 接收一个用户传入的路径
file_path - 先做基础检查:不能是绝对路径,不能以
..开头(防止跳目录) - 把用户路径和项目根目录拼起来
- 最关键一步:检查拼接后的路径,是否真的在项目根目录里面
- 如果在里面 → 返回合法路径
- 如果跑到外面去了 → 直接 403 拒绝
relative_to 是什么?
relative_to 是 Python pathlib.Path 的方法。
作用
判断一个路径,是不是另一个路径的"子路径"。
例子
python
REPO_ROOT = Path("/home/my/project")
target = Path("/home/my/project/src/app.py")
target.relative_to(REPO_ROOT)
# 成功 → 说明 target 在 REPO_ROOT 里面
如果路径跑到外面了:
python
target = Path("/etc/passwd")
target.relative_to(REPO_ROOT)
# 报错 ValueError
总结一句话
relative_to 就是用来检查:这个文件是不是乖乖待在项目目录里,没跑到外面去。
完整通俗总结
这个函数 = 路径安全守门员
- 你给它一个文件路径
- 它拼命确保这个路径不会逃出项目根目录
- 逃出去 → 403 禁止
- 乖乖在里面 → 返回合法路径
relative_to = 检查是否在目录内的核心工具