使用os.path.abspath来验证不受信任的文件名的位置是否安全?

mcm*_*cmt 3 python security

我不认为我错过任何东西.然后我又是一个新手.

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()
Run Code Online (Sandbox Code Playgroud)

编辑:我意识到如果文件不存在(至少在web.py下),这将返回错误的HTTP错误代码.我会解决这个问题.

Ale*_*lli 6

os.path.abspath,本身,是非常安全的.assert如果在下运行python -O,您的支票将被编译掉,这是一个风险.如果你STATIC_PATH不正确的目录分隔符结束,你可能会不小心让这恰好把它作为前缀的路径-例如,如果STATIC_PATH/foo/bar,你会错误地接受一个文件下生活/foo/barbie/(所以,除非STATIC_PATH 与终端分隔符,你需要稍微严格的检查以获得强有力的保证).