Я знаю, что это работает для zip-файлов, но я не слишком уверен насчет файлов xlsx. Стоит попробовать:
Чтобы вывести список файлов в zip-архиве:
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
for ($i=0; $i<$zip->numFiles; $i++) {
print_r($zip->statIndex($i));
}
$zip->close();
} else {
echo 'failed, code:' . $res;
}
Это распечатает все файлы следующим образом:
Array
(
[name] => file.png
[index] => 2
[crc] => -485783131
[size] => 1486337
[mtime] => 1311209860
[comp_size] => 1484832
[comp_method] => 8
)
Как вы можете видеть здесь, он дает size
и comp_size
для каждого архива. Если это архивная бомба, соотношение между этими двумя числами будет астрономическим. Вы можете просто установить максимальный размер распакованного файла в мегабайтах, который вам нужен, и, если он превышает этот размер, пропустить этот файл и вернуть пользователю сообщение об ошибке, иначе продолжить извлечение. См. руководство для получения дополнительной информации.