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

时间:2010-04-19 00:25:47

标签: 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()

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

3 个答案:

答案 0 :(得分:6)

os.path.abspath本身就非常安全。如果在assert下运行,您的python -O支票将被编译掉,这是一个风险。如果您的STATIC_PATH没有以正确的目录分隔符结尾,您可能会意外地允许恰好将其作为前缀的路径 - 例如,如果STATIC_PATH/foo/bar,那么您d错误地接受/foo/barbie/下的文件(因此,除非STATIC_PATH 以分隔符结尾,否则您需要稍微更严格的检查以获得强有力的保证)。

答案 1 :(得分:1)

一般来说,处理这类问题是一个巨大的痛苦。总是有一些巧妙的方法来组合路径名来创建程序员没想到或计划的东西。

更好的解决方案通常是确保您的网络服务器在可以访问其有权访问的文件的用户下运行。我认为ssh问题的一个简单解决方案是不允许此用户SSH访问。如果您确实需要在此用户下登录,我会考虑使用其他帐户登录并su

答案 2 :(得分:0)

确保STATIC_PATH以目录分隔符结尾,或者full中跟随它的字符是这样的。