2009-09-22 4 views
47

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

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

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

UPDATE Не могли бы вы рассказать мне, как это делается на Python или Java?

+1

Коэффициент сжатия может составлять от 1000 до 1 - не только он потребляет много места на диске, но также занимает много времени, чтобы записать результат. – sharptooth

+1

[Связанный вопрос о gzip и bzip2] (http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb). –

ответ

20

Попробуйте это в 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() 
+5

По крайней мере, с gzip я думаю, что несжатый размер может быть не в заголовке (так что он может работать с zip, но не с .tar.gz) – tonfa

+0

@tonfa, спасибо за упоминание, что zipfile doesn 't обрабатывать формат gnu zip. –

+4

IIRC, стандарт Zip (и давайте посмотрим правде в глаза, если вы хотите вызвать DoS, вы обязательно будете следовать стандартам) позволяет исключить некоторые размеры из центрального каталога и заголовков записей. –

4

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

5

Проверить заголовок почтового первым :)

+2

проверить комментарии в ответе Ника Дандулакиса – n611x007

1

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

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

10

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

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

4

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

19

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

Смежные вопросы