gpt4 book ai didi

python - 如何仅使用相对路径加入?

转载 作者:行者123 更新时间:2023-11-30 23:22:24 26 4
gpt4 key购买 nike

对于一个简单的 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 被解析为脚本目录内的一个文件。然而没想到还有第二个和第三个例子。由于附加路径被解释为绝对路径,因此它完全忽略脚本文件所在的目录。

这是一个安全风险,因为文件系统上的所有文件都可以访问,而不仅仅是脚本子目录内的文件。为什么 Python 的 os.path.join 允许使用绝对路径连接以及如何阻止它?

最佳答案

os.path.join() 不适合不安全的输入,不。绝对路径忽略前面的参数是完全有意为之的;例如,这允许在配置文件中支持绝对路径和相对路径,而无需测试输入的路径。只需使用 os.path.join(standard_location, config_path) 即可,它会为您做正确的事情。

看看Flask's safe_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 。最后但并非最不重要的一点是,绝对文件名或相对文件名也是明确禁止的。

关于python - 如何仅使用相对路径加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24510324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com