Как определить, является ли допустимой ошибка Zip Bomb, возникающая при получении файлов стилей Excel?
У меня есть фрагмент кода, который выдает ошибку, когда я пытаюсь получить таблицу стилей для файла Excel, используя Apache POI XSSFReader. Все, что я делаю, включая файл, показано ниже:
XSSFReader reader = new XSSFReader(OPCPackage.open(excelFile.getPath(), PackageAccess.READ));
StylesTable table = reader.getStylesTable();
Я получаю следующую ошибку:
Вызвано: java.io.IOException: обнаружена бомба Zip! Файл будет превышать определенные ограничения, которые обычно указывают, что файл используется для раздувания использования памяти и, таким образом, может представлять угрозу безопасности. Вы можете настроить эти ограничения с помощью setMinInflateRatio() и setMaxEntrySize(), если вам нужно работать с файлами, которые превышают эти ограничения. Счетчик: 1644067, счетчик цис: 16384, коэффициент: 0,009965530601855033Пределы: MIN_INFLATE_RATIO: 0,01, MAX_ENTRY_SIZE: 4294967295
Я не уверен, как определить, является ли это ложным срабатыванием (открытие файла в Excel кажется нормальным), и если да, то как с этим справиться?
1 ответ
Эти проверки в основном предназначены для случаев, когда вы принимаете документы от недоверенных коллег, например, когда пользователи вашего веб-сайта могут загружать произвольные документы для обработки через ваш сервис.
В этом случае вы хотите избежать получения документов, которые могут взорвать ваш сервер из-за чрезмерного использования памяти.
Поэтому Apache POI имеет ограничения по умолчанию, которые разработчики посчитали "нормальными", чтобы разрешить обработку почти всех допустимых документов, но должны блокировать все документы, отформатированные со злым умыслом.
Всякий раз, когда вы знаете, откуда происходит документ, и доверяете источнику не создавать вредоносные документы, вы можете смело устанавливать более высокие ограничения, если это необходимо. В вашем случае размер сжатых данных намного меньше, чем у расширенных данных, что считается подозрительным, таким образом, устанавливая более низкий минимальный коэффициент инфляции, например ZipSecureFile.setMinInflateRatio(0.009)
Перед загрузкой документа вы должны быть в состоянии заставить его работать на вас.