【发布时间】:2014-07-01 12:28:48
【问题描述】:
对于一个简单的 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 允许加入绝对路径,我该如何防止呢?
【问题讨论】:
标签: python python-3.x path filesystems webserver