Надежность Mimetypes в загрузках (PHP) - PullRequest
7 голосов
/ 14 мая 2011

У меня был этот вопрос некоторое время: как именно определяется тип файла MIME? Я полагаю, что это делается путем проверки, содержат ли определенные байты файла какие-либо из известных магических чисел / сигнатур файлов , верно?

Если это так, то возникает другой вопрос. Допустим, я загружаю скрипт bash с поддельной подписью GIF-файла на веб-сайт, который позволяет загружать только изображения, что произойдет? Или:

  1. процедура обнаружения MIME-типов достаточно умна, чтобы обнаружить поддельные подписи, или
  2. image/gif ошибочно возвращается как mimetype, и загрузка может продолжаться

У меня нет банкомата с установленным HEX-редактором, и я не люблю делать выводы, связанные с безопасностью, из тестов, поскольку я могу что-то упустить (или неверно истолковать), поэтому мой вопрос: какой из приведенных выше вариантов исправить?

Кроме того, существуют ли другие лучшие практики (помимо проверки mimetype), чтобы гарантировать, что любой данный файл действительно является тем, чем он кажется / должен (или разрешен) быть? Заранее спасибо.

PS: Просто для ясности, я не спрашиваю об индексе type в суперглобальном $_FILES.

Ответы [ 3 ]

6 голосов
/ 14 мая 2011

Насколько я понимаю, процедуры определения MIME в коде выгрузки файлов являются чрезвычайно грубыми, и что тип MIME в массиве $ _FILES просто нельзя доверять.По моему опыту, его легко обмануть.

Вам лучше использовать библиотеку Fileinfo, которая обеспечивает более надежное обнаружение типов файлов.

http://www.php.net/manual/en/ref.fileinfo.php

2 голосов
/ 14 мая 2011

Если вы говорите о $_FILES['userfile']['type'], то эта информация отправляется браузером.Он может присутствовать или не присутствовать, и даже если он присутствует, вы должны обрабатывать его так же, как и любой другой пользовательский ввод.

Если вы заинтересованы в проверке изображений, вы можете использовать функцию getimagesize для определения типа файла.Эта функция возвращает NULL для изображений, которые она не может понять.Даже если он возвращает действительный тип изображения, вы все равно можете отклонить файл, например, если вы ожидаете GIF и JPEG, и вместо этого вы получите TIFF.

Кроме того, веб-сервер будет определять, выполнять ли файл независимо отна разрешениях файла (бит выполнения и строка shebang) и расширение файла.Если вы продолжите проверку этих двух, вы, вероятно, в порядке.

0 голосов
/ 14 мая 2011

Насколько я понимаю, это (уязвимые типы MIME) является причиной того, что имена файлов должны быть зашифрованы с помощью различных средств, когда они загружаются, а затем сохраняются в базе данных для извлечения с помощью идентификационных номеров.В принципе, если кому-то удастся загрузить вредоносный скрипт, он никогда не сможет найти его для запуска?

...