在extractall之前检​​查tar存档

时间:2011-11-13 15:56:48

标签: python tar

在python文档中,建议不要在没有事先检查的情况下提取tar存档。使用tarfile python模块确保存档安全的最佳方法是什么?我应该迭代所有文件名并检查它们是否包含绝对路径名?

以下内容是否足够?

import sys
import tarfile
with tarfile.open('sample.tar', 'r') as tarf:
    for n in tarf.names():
        if n[0] == '/' or n[0:2] == '..':
            print 'sample.tar contains unsafe filenames'
            sys.exit(1)
    tarf.extractall()

修改

此脚本与2.7之前的版本不兼容。 cf with and tarfile

我现在迭代成员:

target_dir = "/target/"
with closing(tarfile.open('sample.tar', mode='r:gz')) as tarf:
    for m in tarf:
        pathn = os.path.abspath(os.path.join(target_dir, m.name))
        if not pathn.startswith(target_dir):
            print 'The tar file contains unsafe filenames. Aborting.'
            sys.exit(1)
        tarf.extract(m, path=tdir)

1 个答案:

答案 0 :(得分:4)

差不多,虽然仍然可以有像foo/../../这样的路径。

最好使用os.path.joinos.path.abspath,它们将在路径中的任何位置正确处理前导/..

target_dir = "/target/" # trailing slash is important
with tarfile.open(…) as tarf:
    for n in tarf.names:
        if not os.path.abspath(os.path.join(target_dir, n)).startswith(target_dir):
            print "unsafe filenames!"
            sys.exit(1)
    tarf.extractall(path=target_dir)