仅如何加入相对路径?

丹麦文

对于一个简单的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

/index.html    => C:\projects\index.html
/\index.html   => C:\index.html
/C:\index.html => C:\index.html

第一个例子很好。将该URL解析为脚本目录内的文件。但是,我没想到第二个和第三个例子。由于附加路径被解释为绝对路径,因此它将完全忽略脚本文件所在的目录。

这存在安全风险,因为可以访问文件系统上的所有文件,而不仅仅是脚本子目录中的文件。为什么Pythonos.path.join允许使用绝对路径连接,如何防止它?

马丁·彼得斯(Martijn Pieters)

os.path.join()不适合不安全的输入,否。绝对故意忽略绝对路径之前的参数。这样就可以在配置文件中同时支持绝对路径和相对路径,而不必测试输入的路径。只需使用os.path.join(standard_location, config_path)它,它将为您做正确的事。

看一下Flasksafe_join()处理不可信文件名的方法:

import posixpath
import os.path

_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep]
                    if sep not in (None, '/'))

def safe_join(directory, filename):
    # docstring omitted for brevity
    filename = posixpath.normpath(filename)
    for sep in _os_alt_seps:
        if sep in filename:
            raise NotFound()
    if os.path.isabs(filename) or \
       filename == '..' or \
       filename.startswith('../'):
        raise NotFound()
    return os.path.join(directory, filename)

这首先使用posixpath(与平台无关的os.path模块的POSIX实现)对URL路径进行规范化;这将删除所有嵌入的.././路径段,从而使其成为完全标准化的相对或绝对路径。

然后,除/排除以外的任何其他分隔符例如,您不得使用/\index.html最后但并非最不重要的一点是,绝对也禁止绝对文件名或相对文件名。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章