Как известно, все загружаемые на сервер файлы нужно проверять на соответствие разрешенным mime-type. Большинство программистов проверяют это соответствие, сверяясь с mime-типом из $_FILES, но этот mime-тип берется из заголовков HTTP запроса и может быть определен неправильно, т.к. определяет его браузер. У меня например, некоторые jpeg-файлы определяются как application/octet-stream и естественно, скрипт их не принимает. К тому же решение построенное на проверке mime-типа из HTTP заголовка потенциально опасно, т.к. заголовки можно подделать и указать любой mime-тип.
Как же сделать правильно?
Нужно установить расширение PECL, которое называется Fileinfo. Это расширение является заменой более старого расширения mime_magic. Валидатор MimeType в Zend Framework использует именно Fileinfo, как наиболее приоритетный способ определения mime-типа. Fileinfo определяет mime-тип по специальным сигнатурам, которые есть внутри файла.
Другой способ состоит в том, чтобы переложить определение mime-типа на веб-сервер. У веб-сервера Apache есть специальный файл magic с сигнатурами, с помощью которого он определяет, какого mime-типа является загружаемый файл, и устанавливает это значение в заголовок. Таким образом, в php скрипт придет верный mime-тип.
Для того, чтобы, Apache определял mime-тип файла, нужно включить модуль mod_mime_magic.
Небольшой офф: не забывайте так же проверять тип файлов еще и по расширению.
Also interesting
Tags: apache2, http, mime magic, mime-type, php, zend framework
Результат выполнения данного примера:
image/gif
text/plain
предыдущий пост корявым вышел…
echo mime_content_type(’php.gif’) . “\n”;
echo mime_content_type(’test.php’);
Результат выполнения данного примера:
image/gif
text/plain
Возможно, всё правильно. PHP файл вполне может так определиться - это уж смотря как в файле с сигнатурами указано. Стоит проверить файл сигнатур.
А почему просто не использовать юниксовую утилиту file?
типа: “” получается вполне кошерно и результативно, без всяких дополнительно подключаемых классов в php..
парсер - лох.. вот код: http://pastie.org/1076976
Как альтернативу - почему бы нет, если не нужна кроссплатформенность.