使用 pathlib 检查子文件夹的安全方法

ldr*_*drg 5 security python-3.x

python3系列最近添加了一个名为pathlib的面向对象的路径操作库。我希望能够断言子文件是父文件的后代,以避免人们阅读 /etc/passwd 等。标准库不提供任何有关安全使用 pathlib 的建议。有人可以提供一些安全使用 pathlib 的最佳实践吗?

目前,我正在做这样的事情。 root是一个 pathlib 对象,它是父文件夹。 path是一个相对于根的路径字符串。然而,它来自用户输入,不能被信任。

try:
    root = root.resolve()
except (FileNotFoundError, RuntimeError):
    raise Exception('your root directory does not exist')

path_obj = root / path
try:
    path_obj = path_obj.resolve()
except (FileNotFoundError, RuntimeError):
    raise Exception('your local file does not exist')

if root not in path_obj.parents:
    raise Exception('nice try')
Run Code Online (Sandbox Code Playgroud)

超级迂腐的注释:在实践中,我对所有三个都提出了完全相同的异常,以免泄漏文件的存在/不存在。

Meh*_*nce -1

您的代码可以防止您的应用程序遭受本地文件包含或目录遍历攻击,但存在一个错误。

您还可以查看静态文件服务器的 Django 源代码来确定您的代码算法。https://github.com/django/django/blob/cb2c3ce15443a0666646e8b60984830c38d3ecde/django/views/static.py