Проверьте архив tar перед извлечением - PullRequest
4 голосов
/ 13 ноября 2011

В документации по python рекомендуется не извлекать архив tar без предварительной проверки. Каков наилучший способ убедиться, что архив безопасен с помощью модуля pyfile tarfile? Стоит ли просто перебирать все имена файлов и проверять, содержат ли они абсолютные пути?

Достаточно ли что-то вроде следующего?

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 с и 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 Ответ

4 голосов
/ 13 ноября 2011

Почти, хотя было бы возможно иметь путь, подобный foo/../../.

Лучше было бы использовать os.path.join и os.path.abspath, которые вместе будут корректно обрабатывать ведущие / и .. s в любом месте пути:

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)
...