Как я могу определить истинное расширение/тип файла программно?

Я работаю над сценарием, который обработает пользовательские загрузки на сервер, и как добавленный уровень безопасности, которую я хотел бы знать:

Существует ли способ обнаружить истинное расширение/тип файла файла и гарантировать, что это не другой тип файла, замаскированный с другим расширением?

Существует ли штамп байта или некоторый уникальный идентификатор для каждого типа/расширения?

Я хотел бы иметь возможность обнаружить, что кто-то не применил другое расширение на файл, который они загружают.

Спасибо,

11
задан Cœur 14 November 2019 в 03:42
поделиться

10 ответов

Едва ли, нет.

Необходимо будет считать первые несколько байтов каждого файла и интерпретировать его как заголовок для конечного множества известных типов файлов. Большинство файлов имеет отличные заголовки файлов, своего рода метаданные в первых нескольких байтах или первых нескольких килобайтах в случае MP3.

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

Для моей программы я отправляю загруженное изображение в imagemagick в блоке try-catch, и если это аварийно завершается, затем я предполагаю, что это было плохое изображение. Это нужно считать небезопасным, потому что я загружаюсь произвольный (предоставленный пользователь) двоичные данные во внешнюю программу, которая обычно является вектором атаки. здесь, я доверяю imageMagick, чтобы не сделать что-либо к моей системе.

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

Править: Я вижу в PHP существуют некоторые инструменты, чтобы сделать это для Вас.

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

13
ответ дан 3 December 2019 в 03:54
поделиться

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

Существует пример его на w3schools сайте.

Я собираюсь протестировать, если это, может быть обманут, когда я получаю шанс.

ОБНОВЛЕНИЕ:

Все остальные, вероятно, знали это, но $ _FILES может быть обманут. Я смог определить его этот путь:

$arg = escapeshellarg( $_FILES["file"]["tmp_name"] );
system( "file $arg", $type );
echo "Real type:  " . $type;

Это в основном использует команду файла Unix. Существуют, вероятно, лучшие пути, но я не использовал PHP в некоторое время. Я обычно избегаю использования системных команд, если это возможно.

2
ответ дан 3 December 2019 в 03:54
поделиться

PHP имеет несколько способов считать содержание файла для определения его типа MIME, в зависимости от которой версии PHP Вы используете:

Взгляните на функции Fileinfo при выполнении PHP 5.3 +

$finfo = finfo_open(FILEINFO_MIME); 
$type = finfo_file($finfo, $filepath);
finfo_close($finfo);  

С другой стороны, проверьте mime_content_type для более старых версий.

$type = mime_content_type($filepath);

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

9
ответ дан 3 December 2019 в 03:54
поделиться

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

Я также имел бы сканер вируса/шпионского ПО и позволил бы ему сделать работу для Вас.

1
ответ дан 3 December 2019 в 03:54
поделиться

В *отклоняют, первые два байта файла говорит Вам (см. "магическое число"). В Windows... иногда это будет верно ("информация о заголовке"). Это - в конечном счете, зависимый O.S.

0
ответ дан 3 December 2019 в 03:54
поделиться

Исполняемые файлы в целом имеют "подпись" на первых байтах; мне трудно, хотя действительно установить, каков тип файла действительно.

0
ответ дан 3 December 2019 в 03:54
поделиться

Какие типы файлов Вы ожидаете? Возможно, Вы могли проверить, что это соответствует тому, что Вы ожидаете и отклоняете все остальное.

0
ответ дан 3 December 2019 в 03:54
поделиться

Другие уже упомянули FileInfo, который я думаю, правильное решение, но я добавлю это на всякий случай, Вы не можете использовать тот по некоторым причинам. Большинство (все?) *отклоняют дистрибутивы, включают названную команду file это при выполнении на файле произведет его тип. Это имеет переключатель для вывода в человекочитаемом формате (значение по умолчанию) или тип MIME. У Вас мог быть свой сценарий, вызывают эту программу на загруженный файл и читают результат. Снова, это не предпочтительный подход. Если Вы находитесь в Windows, эта утилита доступна через Cygwin.

0
ответ дан 3 December 2019 в 03:54
поделиться

Действительно ли проверка является типом MIME достаточно просто? Я предполагаю, что изменение расширения на файле не изменяется, это - тип MIME?

Действительно ли тип MIME является достаточно сильным индикатором, чтобы пройти здесь?

Спасибо за все ответы к настоящему времени.

0
ответ дан 3 December 2019 в 03:54
поделиться

Действительно ли проверка является типом MIME достаточно просто? Я предполагаю, что изменение расширения на файле не изменяется, это - тип MIME? Действительно ли тип MIME является достаточно сильным индикатором, чтобы пройти здесь?

Это действительно зависит от того, как это используется.

  • Если Вы обеспечиваете загрузки и загрузки, то ничто не имеет значения, так как это не выполняется.
  • Если это обрабатывается веб-сервером, то это будет зависящим от того, как веб-сервер настроен, хотя подвергающийся большей части остальной части этих комментариев.
  • Если это будет изображение, то это или отобразится, или нет, или является целью использования библиотеки изображений. Но только они.
  • Что-то как файл PDF не может влиять на Ваш сервер, а скорее компьютер человека, получающего доступ к файлу.
  • Если это будет переданным функции как "система ()", затем мы вернулись к поведению ОС - как будто по этому "дважды щелкнули", и расширение файла можно было бы даже рассмотреть.
0
ответ дан 3 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: