对于一个简单的web服务器脚本,我编写了以下函数,将url解析为文件系统。在
def resolve(url):
url = url.lstrip('/')
path = os.path.abspath(os.path.join(os.path.dirname(__file__), url))
return path
以下是__file__
变量的输出示例C:\projects\resolve.py
。在
第一个例子很好。url被解析为脚本目录中的一个文件。然而,我没想到第二个和第三个例子。由于附加的路径被解释为绝对路径,它完全忽略脚本文件所在的目录。在
这是一个安全风险,因为文件系统上的所有文件都可以访问,而不仅仅是脚本子目录中的文件。为什么Python的os.path.join
允许与绝对路径连接?我如何阻止它?在
os.path.join()
不适合不安全的输入,不。绝对路径忽略前面的参数是完全有意的;这允许在配置文件中同时支持绝对路径和相对路径,例如,不必测试输入的路径。只要使用os.path.join(standard_location, config_path)
,它就会为您做正确的事情。在查看Flask's ^{} 来处理不受信任的文件名:
这将使用}路径段,使其成为完全标准化的相对或绝对路径。在
posixpath
(平台无关的os.path
模块的POSIX实现)首先规范化URL路径;这将删除任何嵌入的../
或{然后排除
/
以外的任何可选分隔符;例如,不允许使用/\index.html
。最后但并非最不重要的是,绝对文件名或相对文件名也被明确禁止。在相关问题 更多 >
编程相关推荐