Подтвердить что ты не робот

Подменю типа MIME

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

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

4b9b3361

Ответ 1

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

Дольше ответ:

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

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

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

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

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

Ответ 2

Осторожно - этот ответ устарел

Документация для 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.

Ответ 3

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

<?php

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

$pathInfo = pathinfo($filename);

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

?>

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

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