Использование apache poi - обнаружена Zip Bomb

Когда я пытаюсь записать данные в таблицу Excel, используя apache poi, который содержит более 64000 записей, где используется SXSSF, и я получаю следующую ошибку,

Zip бомба обнаружена! Файл будет превышать макс. отношение размера сжатого файла к размеру расширенных данных. Это может указывать на то, что файл используется для раздувания использования памяти и, следовательно, может представлять угрозу безопасности. Вы можете настроить этот предел с помощью ZipSecureFile.setMinInflateRatio(), если вам нужно работать с файлами, которые превышают этот предел. Счетчик: 820224, счетчик цис: 8192, коэффициент: 0,009987515605493134 Лимиты: MIN_INFLATE_RATIO: 0,01

Я нашел решение, заявив, добавив ZipSecureFile.setMinInflateRatio(0,009), и мне нужно знать, почему это происходит, и какой лимит мне нужно указать для вышеприведенного объявления об ошибке, где добавить решение, ссылка на решение: ( Как определить, допустима ли ошибка Zip Bomb при получении таблицы стилей Excel?)

Пожалуйста, дайте мне знать, если есть другое решение для этого

3 ответа

Решение

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

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

Поскольку файлы.xlsx на самом деле являются архивированными файлами, содержащими файлы XML, существует вероятность возникновения такой уязвимости в почтовых индексах в POI.

Чтобы этого не происходило, в Apache POI встроены некоторые защитные функции, которые включены по умолчанию. Поэтому, если вы создаете файл с необычным содержимым, например, множеством строк / столбцов с одинаковым содержимым, вы можете использовать эти меры предосторожности и получить исключение, как показано выше.

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

См. https://bz.apache.org/bugzilla/show_bug.cgi?id=58499 для связанной проблемы и исключения ZIp-bomb при написании большого отформатированного Excel (.xlsx) и Как определить, возникла ли ошибка Zip Bomb при получение файлов Excel Таблица стилей является законной? для подобных обсуждений.

Обходной путь - добавить эту строку перед открытием книги:

ZipSecureFile.setMinInflateRatio(0);

Вы можете избежать проблем с zip-бомбой, читая из InputStream вместо чтения из файла, подобного этому

File fp = new File(excelFile);
FileInputStream fpis = new FileInputStream(fp);
try {
    wb = WorkbookFactory.create(fpis);
} finally {
    fpis.close();
}

Но имейте в виду, что в документации на WorkbookFactory.create(java.io.InputStream) говорится, что "загрузка из InputStream требует больше памяти, чем загрузка из файла"

Другие вопросы по тегам