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Сообщить о неточности