【发布时间】: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