在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)
答案 0 :(得分:4)
差不多,虽然仍然可以有像foo/../../
这样的路径。
最好使用os.path.join
和os.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)