我不认为我遗漏了什么。话又说回来,我还是个新手。
def GET(self, filename):
name = urllib.unquote(filename)
full = path.abspath(path.join(STATIC_PATH, filename))
#Make sure request is not tricksy and tries to get out of
#the directory, e.g. filename = "../.ssh/id_rsa". GET OUTTA HERE
assert full[:len(STATIC_PATH)] == STATIC_PATH, "bad path"
return open(full).read()
编辑: 我意识到如果文件不存在(至少在 web.py 下),这将返回错误的 HTTP 错误代码。我会解决这个问题。
最佳答案
os.path.abspath
本身是相当安全的。如果在 python -O
下运行,您的 assert
检查将被编译掉,这是一个风险。如果您的 STATIC_PATH
没有以正确的目录分隔符结尾,您可能会不小心允许一个恰好以它作为前缀的路径——例如,如果 STATIC_PATH
是 /foo/bar
,您会错误地接受位于 /foo/barbie/
下的文件(因此,除非 STATIC_PATH
确实 以分隔符结尾,您需要稍微严格的检查以提供强有力的保证)。
关于python - 使用 os.path.abspath 来验证不受信任的文件名的位置是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664568/