Python Glossary English

Python 3.12+tarfileфункция

tarfile.data_filter()

фильтры распаковки

Фильтр распаковки 'data': отсекает всё опасное для обычных данных — пути наружу, ссылки наружу, устройства, лишние права.

Синтаксис

tar.extractall(path, filter='data')  # или tarfile.data_filter(member, path)

Это умолчание с Python 3.14 и правильный выбор для чужих архивов: filter='data' в extract()/extractall(). Помимо проверок tar_filter он запрещает ссылки на абсолютные пути и за пределы папки, устройства и каналы, сбрасывает владельца и выставляет права так, чтобы файл можно было читать. Ведущий '/' он молча срезает, а не отклоняет. Атаки отказом в обслуживании (огромные файлы) не ловит.

Примеры

import io, tarfile
with tarfile.open('evil.tar', 'w') as tar:
    info = tarfile.TarInfo('../escape.txt')
    info.size = 3
    tar.addfile(info, io.BytesIO(b'bad'))
with tarfile.open('evil.tar') as tar:
    try:
        tar.extractall('out', filter='data')
    except tarfile.OutsideDestinationError as e:
        print(type(e).__name__, e.tarinfo.name)  # → OutsideDestinationError ../escape.txt
import tarfile
m = tarfile.TarInfo('/etc/app.conf')
m.mode = 0o4777
safe = tarfile.data_filter(m, 'out')
print(safe.name, oct(safe.mode), safe.uid)  # → etc/app.conf 0o755 None

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности