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 = 检查是否在目录内的核心工具

相关推荐
m0_7485548116 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
smj2302_7968265216 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
阿正呀17 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_9012005317 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
_.Switch17 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
Mr_sst17 小时前
Claude Code 部署与使用保姆级教程(2026 最新)
python·ai
瞎某某Blinder17 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
m0_4954964118 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume19 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python