Надежность Mimetypes в Uploads (PHP)

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

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

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

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

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

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

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

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

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

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

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

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

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