Проверка на MIME-тип в php довольно проста, но, насколько я знаю, MIME может быть подделан. Атакующий может загрузить скрипт php, например, с типом jpeg mime. Одна вещь, которая приходит на ум, это проверить расширение загружаемого файла и убедиться, что оно соответствует типу mime. Все это предполагает, что каталог загрузки доступен для браузера.
Вопрос: Существуют ли другие способы предотвращения попадания «плохих файлов» при подмене типа mime?
Краткий ответ: Нет.
Более длинный ответ:
Сравнение расширения и его соответствия типу MIME ничего не мешает. Как было сказано в комментариях, еще проще изменить расширение файла. Тип и расширение MIME следует понимать только как подсказки, в них нет внутренней безопасности.
Гарантия того, что входящие файлы не причинят вреда, очень зависит от того, какова будет их цель. В вашем случае я понял, что вы ожидаете изображения. Итак, что вы могли бы сделать, это сначала выполнить некоторые проверки работоспособности: отсканируйте первые пару байтов, чтобы увидеть, содержат ли файлы соответствующие сигнатуры заголовков изображений — они есть во всех соответствующих форматах изображений.
«Заголовки подписи» помогают вам решить, какой формат изображения пытается имитировать файл. На следующем этапе вы можете проверить, соответствует ли остальное содержимое формату основного изображения. Это гарантировало бы вам, что файл действительно является файлом изображения этого определенного формата.
Но даже в этом случае файл может быть тщательно создан таким образом, чтобы при отображении изображения популярная библиотека, используемая для отображения этого изображения (например, libpng и т. Д.), Сталкивалась с переполнением буфера, которое злоумышленник обнаружил в этой библиотеке.
К сожалению, нет способа активно предотвратить это, кроме как вообще не допустить никакого вмешательства со стороны клиента.
Осторожно — этот ответ устарел
Документация для getimagesize явно заявляет: «Не используйте getimagesize () для проверки того, что данный файл является допустимым изображением.
Образец кода:
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 документация.
Проверьте расширение.
<?php
$okFiles = array('jpg', 'png', 'gif');
$pathInfo = pathinfo($filename);
if(in_array($pathInfo['extension'], $okFiles)) {
//Upload
}
else {
//Error
}
?>
Вы также можете — как вы сказали — проверить, соответствует ли расширение типу MIME, но гораздо проще просто проверить расширение.
Кстати, почему вы заботитесь о типе MIME?