Перейти к содержимому

Реферальная программа Мегаплана


Как проверить, что загруженный файл на сервер - zip-архив?

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 10 Декабрь 2010 - 14:29

как проверить, что загруженный файл на сервер - zip-архив?
т.е. файл созданный при помощи архиватора, упаковав один или несколько файлов, не через проверку расширения и mime-типа, которые легко подделать?

 

 

  • 0

#2 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 10 Декабрь 2010 - 16:33

Наверно, распаковать его))
  • 0

#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 10 Декабрь 2010 - 17:47

surfer, если почитать инфу про ZIP (wikipedia.en - zip, Работаем с ZIP-файлами), данный формат файла содержит заголовки, которые можно прочитать и сверить.

ZIP-файл начинается с последовательностей записей четырех типов:
LOCREC, CENTREC, ENDREC, EXTREC

Каждая запись начинается с метки 'PK'
(0x504B) и типа записи:

(0x0102) - CENTREC
(0x0304) - LOCREC
(0x0506) - ENDREC
(0x0708) - EXTREC

Получаем код проверки:
<?php

// разрешенные первые 4 байта => 504b - PK, остальное - тип архива
$allow_zip = array(
"504b0102",
"504b0304",
"504b0506",
"504b0708"
);

$filename_zip = "file.zip"; // имя файла для проверки

// проверяем наличие файла и если существует, пытаемся открыть его на чтение
if( !file_exists($filename_zip) || ($res = fopen($filename_zip, 'r')) == false )
exit('Не могу получить доступ к файлу');

$flag = ""; // сверяемая строка (4 байта)

// считываем первые 4 байта из файла
for($i = 0; $i < 4; $i++)
if( ($sym = fgetc($res)) !== false ) // если не конец файла (EOF)
$flag .= $sym; // заносим символ в флаг

$flag = bin2hex($flag); // преобразуем бинарную строку в 16-ричную.

echo in_array($flag, $allow_zip) ? "ZIP" : "NOT ZIP"; // если флаг попадает в разрешенные - то ZIP, иначе NOT ZIP

?>

Проверил на файлах типов: zip, gz, tgz, tar, xls. Всё работает нормально.

P.s.: Советую всё равно так же проверять по Mime и расширению, так часть сразу отбросим :)
  • 0


Оформление форума – IPBSkins.ru