|
|
|
| Использую класс PHP ZipArchive для работы с архивами zip, которые пользователи могут загружать мне на сервер. По ходу разработок задумался над проблемами архивных бомб, т.е. таких архивов, которые могут содержать несколько гигабайт файлов при размере архива всего в несколько килобайт.
Так вот, как, используя в проекте PHP, узнать размер сжатых файлов в архиве zip?
В доках PHP к ZipArchive абсолютно ничего нет про размер файлов в архиве. Может, можно как-то через функции pack/unpack, как в одном примере по получению информации из файла mp3? | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 20:19)
| | Это какой архив может сжать несколько ГБ до нескольких КБ? | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 20:33)
| | Да любой приличный архиватор может. | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 20:51)
| | Даже так? Нука сожмите "приличным" аврхиватором mp3, видео, картинки и т.п., размером в 3 гига до нескольких КБ и выложите здесь.
Ну а чтобы написать текст в 3 ГБ, так это надо сильно постараться. | |
|
|
|
|
 3.1 Мб |
|
|
для: sim5
(16.07.2010 в 20:54)
| | > сожмите "приличным" аврхиватором mp3, видео, картинки и т.п
Эээм.. это тут каким боком? Речь о намеренно создаваемых архивах с конкретной целью - в данном случае навредить... сам такое делал когда то очень давно.. паковал файлик в RAR-SFX, записывал на диск в комплекте с autorun.inf... конечно только ради шутки)
> Ну а чтобы написать текст в 3 ГБ, так это надо сильно постараться.
Текст, не текст.. не важно, главное чтобы данные были с закономерностью, которую сможет определить алгоритм архиватора.
<?php
set_time_limit(0);
$f = fopen('m:\bigfile.txt', 'w');
$str = str_repeat("sim5\r\n", 1000);
$strlen = strlen($str);
for($i = 0; $i<=(1024*1024*1024*5); $i+=$strlen)
fwrite($f, $str);
fclose($f);
|
В аттаче архив. | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 21:01)
| | Любым боком. Есть архиватор сжимающий действительно прилично, но распаковка его архива, это очень длительный процесс, который для сети не годится, да и не до килобайтов он жмет гигабайты. Остальные просто не способны такое сделать, тем более с mp3 файлами.
Туфту и я могу создать. Я о реальности. И заметьте, что ваш архив, это мегабайты, а не килобайты. | |
|
|
|
|
 260.7 Кб |
|
|
для: sim5
(16.07.2010 в 21:06)
| | Насчёт мегабайтов/килобайтов это я буду считать придиркой. Какая разница, если и то и то можно загрузить и потенциально причинить вред?
Если это так важно... аттач.
> Я о реальности.
Так и я о ней, в этой самой реальности придёт реальный зловредный юзер и подбросит такую реальную гадость. | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 21:19)
| | Еще раз:
>Это какой архив может сжать несколько ГБ до нескольких КБ?
>Да любой приличный архиватор может.
Я о бомбе спрашивал, или о возможности такого сжатия? А вы о чем утверждали - о реальности таких архиваторов? Если бы не ночь, заматерился бы, ей богу. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:23)
| | Значит предложения надо понятней строить. Слово "архив" было воспринято как сокращённое подлежащее, а подлежащего там, оказывается, и в помине нет. | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 21:26)
| | Я спрашивал не вас, и явно не о подделках. Так что о притензиях о непонятности моего вопроса не стоит. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:29)
| | > Я спрашивал не вас
Не меня. Но на форуме это не имеет значения. Сообщения доступны для чтения всем, ответить тоже имеет возможность кто угодно, даже я. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:23)
| | > Если бы не ночь, заматерился бы, ей богу.
Это как раз самое подходящее время ;)) | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 20:33)
| | Да тот же самый винрар со своим "умным" алгоритмом догадается, что если данные повторяются, то их можно _ОЧЕНЬ_ удачно сжать, если правильно отбросить повторяющиеся данные. Подобная идея используется и в форматах изображений сжимающие изображение без потери качества, в частности в GIF
А что бы создать архивную бомбу не нужно быть гением. Я например, только что создал текстовой документ, открыл его с помощью AkelPad (тот же блокнот, только умеет работать с большими файлами), методом зажатия нужных клавиш создал в нём 50 млн нулей (0), сохранил, что дало файл весом 50 Мб, сжал его винраром в зип архив, указав максимальное сжатие. На выходе получил компактный архивчик весом 50 Кб. Итого - сжатие в 1000 раз.
У меня на на сервер через мой онлайн-сервис пользователь может загружать зип архивы до 50 Мб. Думаю, в 50Мб можно уложить много дерьма, которое, если его сервер начнёт распаковывать, сильно займёт его дисковое пространство. | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 21:16)
| | RAR никогда не сожмет реальный mp3 в несколько МБ до килобайтов. Не надо ерунду пороть. Да и не о бомбе я спрашивал оппонента, это совсем иной вопрос, а реальности такого сжатия, что он утверждает. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:20)
| | Ну mp3 да, врядли сожмёт. Мп3 - это всё таки уже формат сжатых данных. Вообще, сейчас многие форматы для мультимедиа подразумевают как можно плотное упаковывание данных. А иначе фильм двд-качества весил бы сотни гигабайт.
А sms-send всё таки помоему нигде и не написал, что он может сжать мп3. Он пишет примерно то же, что и я: если постараться, можно создать архив в несколько килобайт, а при распаковке он займёт на винте в тысячи раз больше собственного веса архива. | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 21:28)
| | Если постараться вас обмануть, это иное. А вот сжимать для сервера mp3 файлы в реальности, другими словами принимать от пользователя в таком виде, имеет смысл только в том случае, если их уж очень крепко заховать от бдительных авторов. А иначе какой смысл? | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:33)
| | На любой даже самый крутой сайт аля Пентагон найдётся свой хакер, я вот так думаю ))
Т.е. всегда надо проверять, что приходит от пользователя, любые данные.
И насчёт mp3: в таких файлах в первых байтах стоит сигнатура аля "привет мир, мой тип - mp3". Т.е. я могу в свой раннее созданный текстовой документ вставить этих несколько первых байт из файла mp3, сохранить получившееся чудо под расширением .mp3 и вот, пожалуйста, у меня получится mp3 файл, который можно будет сжать в 1000 раз. НО: я не гарантирую, что он проиграется, но всё же.. по всем другим признакам, это будет наш mp3 :)
P.S. Мне пользователи в архивах загружают не mp3 )))) | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 21:45)
| | Вот оно как... Просто я прочитал, что вы интересовались полученим заголовка, mp3 файла, потому и решил такое. В общем подумал, что вы сами себе излишние проблемы создаете.
Если же вопрос стоит так, то в rar нет, насколько я знаком, извлечение кусочка файла из архива. Да и если говорить о бомбах, так уж бомбить до конца, я как раз буду делать то, что вы называете аля "привет мир, мой тип - mp3". | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:33)
| | > А иначе какой смысл?
Архив может использоваться не только для сжатия данных, но и для банального собирания нескольких файлов в один. Если пользователь хочет загрузить сотню фоток в альбом, заполнять поочерёдно 100 полей формы ему будет достаточно скучно.
Ничего, что я опять имею наглость отвечать на вопрос, адресованный не мне? | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 21:46)
| | > Ничего, что я опять имею наглость отвечать на вопрос, адресованный не мне?
Ничего )) | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 21:46)
| | Я же не утверждаю, что архивом этого нельзя делать, это раз. Загружать сотню фоток архивом, я мог бы позволить только очень доверенным лицам, ибо проверять в таком архиве бомы я бы не стал. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 21:54)
| | Кто пользуется юкозом? Я пользуюсь. У них модуль "Фотоальбом" позволяет загружать сразу несколько фоток в архиве. Очень удобно. И ни о каких доверенных лицах речь не идёт.
ИМХО: не стоит ограничивать пользователя в действиях (мол, если не доверенное лицо, то иди нах и т.п.). Главное - чтобы всё контролировалось и проверялось. | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 22:03)
| | Сотню фоток архивом на сервер? | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 22:05)
| | Там кажется, ограничение на 20 фоток в архиве, точно не помню. Блин.. надо бы попробовать на досуге создать архивную бомбу, загрузить туда и глянуть, что получиться))) | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 22:17)
| | Взрыв и клубы дыма в браузере.;-)
Ну вот, ограничения. И я бы 100 не разрешил. Мало того, что могут туфту подкинуть, но ведь еще могут забросить просто как "бесхозный груз"... нет, уж лучше по-старинке. | |
|
|
|
|
|
|
|
для: sim5
(16.07.2010 в 22:22)
| | > Ну вот, ограничения.
Напомню, что в контексте темы не имеет значения 100, 20 или 1 файл в архиве.
А какую туфту нельзя по традиционной "старинке" подкинуть? Единственная гадость - упакованная "бомба" - распознаётся и отсекается элементарно проверкой размера упакованных файлов, в остальном, вроде бы, отличий нет. Тогда зачем ограничивать пользователя в удобстве? | |
|
|
|
|
|
|
|
для: sms-send
(16.07.2010 в 22:39)
| | Напомню, что я тоже не говорил, что по-старинке нельзя туфту закинуть. Просто открый файл легче проверить, а если речь идет об архиве, то лучше ограничить его вложение.
Вы сказали о сотне файлов, я ответил в этом ключе. Собвственно не обязательно размер может быть фиктивным, он может быть и "легальным", но будут подделаны заголовки, либо подцеплены "нелегальные" фрагменты к файлам. Все это надо проверять.
Дело хозяйское, вы вольны поступать как хотите, и давать любую вольность своим пользователям, я же вас не заставляю делать так, как я хочу. Я же буду ограничивать вложения, если это архив, либо количество файлов при прямой загрузке. | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 20:19)
| | Кстати, с помощью гугл-ответов нашёл это http://php.russofile.ru/ru/authors/unsort/zip/ - попробуем курнуть эту травку.. | |
|
|
|
|
|
|
|
для: Ferro7
(16.07.2010 в 21:50)
| | о, всё гениальное просто.. http://www.php.net/manual/en/ref.zip.php
в комментариях есть пользовательская функция decompress_first_file_from_zip - в ней размер файлов в архиве определяется довольно просто | |
|
|
|