можно ли ограничить размер несжатых заархивированных файлов в unix?

Я реализую службу, в которой мне нужно извлечь zip-файл, загруженный пользователем.

чтобы избежать переполнения диска, я должен ограничить ОБА размер zip-файла и размер разархивированных файлов.

можно ли это сделать (проверьте размер разархивированных файлов) ПЕРЕД распаковкой? (из соображений безопасности).

я использую unix, вызываемый из PHP-скрипта.


person Yoni Hassin    schedule 06.09.2012    source источник


Ответы (1)


Поскольку вы работаете на PHP, используйте его библиотеку ZipArchive.

$zip = zip_open($file);
$extracted_size = 0;
while (($zip_entry = zip_read($zip))) {
    $extracted_size += zip_entry_filesize($zip_entry);
    if ($extracted_size > $max_extracted_size) {
        // abort
    }
}
// do the actual unzipping

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

person Gilles 'SO- stop being evil'    schedule 06.09.2012
comment
Похоже, официальный пример для zip_entry_filesize: фактически функция, которую можно сразу же использовать для проверки наличия зип-бомб. - person ArjunShankar; 07.09.2012
comment
не могу поверить, что погрузился в команды оболочки, в то время как ответ состоял из нескольких строк на PHP :) Я предполагал, что команды оболочки будут более гибкими, но это кажется правильным ответом. - person Yoni Hassin; 07.09.2012