А как вы проверяете mime-type файлов в php?

Как известно, все загружаемые на сервер файлы нужно проверять на соответствие разрешенным 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: , , , , ,

6 Responses to “А как вы проверяете mime-type файлов в php?”

  1. demoriz says:

    Результат выполнения данного примера:

    image/gif
    text/plain

  2. demoriz says:

    предыдущий пост корявым вышел…

    echo mime_content_type(’php.gif’) . “\n”;
    echo mime_content_type(’test.php’);

    Результат выполнения данного примера:

    image/gif
    text/plain

    • Ouch! says:

      Возможно, всё правильно. PHP файл вполне может так определиться - это уж смотря как в файле с сигнатурами указано. Стоит проверить файл сигнатур.

      • psyhomo says:

        А почему просто не использовать юниксовую утилиту file?
        типа: “” получается вполне кошерно и результативно, без всяких дополнительно подключаемых классов в php..

Leave a Reply