MIME Тип подмены - PullRequest
       30

MIME Тип подмены

12 голосов
/ 06 ноября 2011

Проверка на тип mime в php довольно проста, но, насколько я знаю, mime может быть подделан. Атакующий может загрузить php-скрипт, например, с типом jpeg mime. Одна вещь, которая приходит на ум, это проверить расширение загружаемого файла и убедиться, что оно соответствует типу mime. Все это при условии, что каталог загрузки доступен для браузера.

Вопрос: Существуют ли другие способы предотвращения проникновения "плохих файлов" при подмене типа mime?

Ответы [ 3 ]

9 голосов
/ 06 ноября 2011

Краткий ответ: Нет.

Более длинный ответ:

Сравнение расширения и его соответствия типу MIME на самом деле ничего не мешает.Как было сказано в комментариях, еще проще изменить расширение файла.Тип и расширение MIME следует понимать только как подсказки, в них нет внутренней защиты.

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

«Заголовки сигнатур» помогут вамрешить, какой формат изображения пытается выдать себя за файл.На следующем этапе вы можете проверить, соответствует ли остальное содержимое формату основного изображения.Это гарантировало бы вам, что файл действительно является файлом изображения этого определенного формата.

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

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

4 голосов
/ 06 ноября 2011

Внимание - этот ответ устарел

Документация для getimagesize явно гласит: «Не используйте getimagesize () для проверки того, что данный файл является допустимым изображением.

В случае изображений

  • Проверьте расширение со списком разрешенных (например, ".jpg", ".jpeg", ".png")
  • Проверьте сам загруженный файл, запустив getimagesize для файла, он вернет FALSE, если это не изображение.

Другие типы загрузки

  • Проверка разрешенных расширений (например, ".pdf")
  • Убедитесь, что тип MIME файла соответствует расширению

Пример кода:

function getRealMimeType($filename) {
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) {
        echo "Opening fileinfo database failed";
        return "";
    }
    return $finfo->file($filename);
}

См. finfo_file документацию.

0 голосов
/ 06 ноября 2011

Проверьте расширение.

<?php

$okFiles = array('jpg', 'png', 'gif');

$pathInfo = pathinfo($filename);

if(in_array($pathInfo['extension'], $okFiles)) {
    //Upload
} 
else {
    //Error
}

?>

Вы также можете - как вы сказали - проверить, соответствует ли расширение типу MIME, но гораздо проще просто проверить расширение.

Кстати, почему вы заботитесь о типе MIME?

...