Использование 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 требует больше памяти, чем загрузка из файла"