安全用户提供的文件名

2024-09-30 22:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序的一部分要求客户端请求文件。现在,行为良好的客户机只请求安全的文件,但我不希望用户提供"../../../creditCardInfo.xls"。确保文件名不高于目录层次结构中某一点的文件不被服务的最简单方法是什么?第一反应是不允许使用..的文件名,但这似乎。。。不完整和不满意。在

当前关于文件名安全性的问题集中在生成一个可写/可读的文件名上,而不是确保不应访问的文件被访问。在


Tags: 文件方法用户目录应用程序客户端客户机层次结构
3条回答

我想您正在寻找一种方法来找到文件的规范(*)路径。即删除了...和符号链接。这就是^{}的角色

>>> os.path.realpath(".")
'/home/sylvain'
>>> os.path.realpath("..")
'/home'
>>> os.path.realpath("./Documents/../..")
'/home'

realpath将遵循symlink并“reduce”路径:

^{pr2}$

。。。然而normpath很容易被滥用:

>>> os.path.normpath("./Documents/../z/..")
'.'

一旦有了规范名称,就可以很容易地检查用户是否应该有权访问请求的文件。比方说和白名单比较。在


(*)一个文件可能有不同的路径,但只有一个规范路径。
有关详细信息,请参见http://www.xyzws.com/Javafaq/what-is-the-difference-between-absolute-relative-and-canonical-path-of-file-or-directory/60。在

如果open使用与os.path.abspath相同的机制来解析路径,这似乎可以工作。这种方法有什么缺陷吗?在

import os

def is_safe(filename):
    here = os.path.abspath(".")
    there = os.path.abspath(filename)
    return there.startswith(here)

>>> is_safe("foo.txt")
True
>>> is_safe("foo/bar/baz")
True
>>> is_safe("../../goodies")
False
>>> is_safe("/hax")
False

如果您在UNIX变体中运行,您可能需要一个chroot jail来阻止对应用程序外部系统的访问。在

这种方法可以避免您编写自己的代码来处理问题,并允许您通过基础设施设置来处理它。如果您需要限制对应用程序中某个区域的访问,因为它会更改进程认为是系统根目录的内容,则这可能不合适。在

相关问题 更多 >