python relative_to

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 禁止访问。


函数执行步骤(简单版)

  1. 接收一个用户传入的路径 file_path
  2. 先做基础检查:不能是绝对路径,不能以 .. 开头(防止跳目录)
  3. 把用户路径和项目根目录拼起来
  4. 最关键一步:检查拼接后的路径,是否真的在项目根目录里面
  5. 如果在里面 → 返回合法路径
  6. 如果跑到外面去了 → 直接 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 = 检查是否在目录内的核心工具

相关推荐
tkevinjd29 分钟前
MiniCode 项目详解6:原项目控制系统的10个缺陷(已修复)
python·llm·agent
dNGUZ7UGj2 小时前
10分钟完成第一个Python小游戏
python·django
没有梦想的咸鱼185-1037-16632 小时前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer
霸道流氓气质2 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
Draina4 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.4 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰5 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~5 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬5 小时前
统计verilog .v文件中output 的bit数
python
gwf2166 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件