Как я могу защитить себя от молнии?

Я только что прочитал zip bombs, то есть zip файлы, содержащие очень большое количество высоко сжимаемых данных (00000000000000000...).

При открытии они заполняют серверный диск.

Как я могу обнаружить zip файл, это zip-бомбу до разархивировать его?

ОБНОВЛЕНИЕ. Можете ли вы рассказать мне, как это делается на Python или Java?

Ответ 1

Попробуйте это в Python:

import zipfile
z = zipfile.ZipFile('c:/a_zip_file')
print 'total files size=', sum(e.file_size for e in z.infolist())
z.close()

Ответ 2

Zip - это, erm, "интересный" формат. Надежное решение - это поток данных, и остановитесь, когда у вас будет достаточно. В Java используйте ZipInputStream, а не ZipFile. Последнее также требует, чтобы вы хранили данные во временном файле, что также не является самым большим из идей.

Ответ 3

Чтение описания в Википедии -

Запретить любые сжатые файлы, содержащие сжатые файлы.
    Используйте ZipFile.entries() для извлечения списка файлов, затем ZipEntry. getName(), чтобы найти расширение файла.
Запретить любые сжатые файлы, содержащие файлы по заданному размеру, или размер не может быть определен при запуске.
    Итерируя по файлам, используйте ZipEntry.getSize() для получения размера файла.

Ответ 4

Сначала проверьте заголовок zip:)

Ответ 5

Если используемый вами декомпрессор ZIP может предоставить данные об исходном и сжатом размере, вы можете использовать эти данные. В противном случае начните распаковывать и контролировать размер вывода - если он слишком сильно сокращается.

Ответ 6

Не позволяйте процессу загрузки записывать достаточно данных, чтобы заполнить диск, то есть решить проблему, а не только одну возможную причину проблемы.

Ответ 7

Убедитесь, что вы не используете системный диск для хранения временных файлов. Я не уверен, проверит ли этот вирусщик, если он столкнется с ним.

Также вы можете посмотреть информацию внутри zip файла и получить список содержимого. Как это сделать, зависит от утилиты, используемой для извлечения файла, поэтому вам нужно предоставить дополнительную информацию здесь.