【问题标题】:Secure way to check subfolder with pathlib使用 pathlib 检查子文件夹的安全方法
【发布时间】:2014-03-30 21:07:23
【问题描述】:

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')

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

【问题讨论】:

  • 攻击者可能会在您调用path_obj.resolve()之后创建一个符号链接

标签: security python-3.x


【解决方案1】:

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

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

【讨论】:

  • 当你说“但有一个错误”时,你是指 JF Sebastian 提到的符号链接竞赛还是其他什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
相关资源
最近更新 更多