Проверка типа mime в php довольно проста, но насколько я знаю, мим может быть подделан. Злоумышленник может загрузить скрипт php, например, типа jpeg mime. Одна вещь, которая приходит на ум, – проверить расширение файла загруженного файла и убедиться, что он соответствует типу mime. Все это предполагает, что каталог загрузки доступен для браузера.
Вопрос: Существуют ли какие-либо другие способы предотвращения «плохих файлов» от подмены типа mime?
Краткий ответ: Нет.
Более длинный ответ:
Сравнивая расширение и убедившись, что он соответствует типу MIME, на самом деле ничего не мешает. Как было сказано в комментариях, еще проще изменить расширение файла. Тип и расширение MIME предназначены только для подсказок, в них нет встроенной безопасности.
Обеспечение того, чтобы входящие файлы не наносили вреда, очень зависит от того, какова будет ваша цель для них. В вашем случае я понял, что вы ожидаете изображения. Итак, что вы можете сделать, сначала выполните некоторые проверки здравомыслия: сканируйте первую пару байтов, чтобы увидеть, содержат ли файлы соответствующие заголовки заголовков изображений – все соответствующие форматы изображений имеют это.
«Заголовки подписей» помогут вам решить, какой формат изображения пытается попытаться выдавать файл. На следующем шаге вы можете проверить, соответствует ли остальная часть содержимого базовому формату изображения. Это гарантирует, что файл действительно является файлом изображения этого конкретного формата.
Но даже тогда файл можно было бы тщательно обработать таким образом, чтобы при отображении изображения популярная библиотека, используемая для отображения этого изображения (например, libpng и т. Д.), Запускалась в переполнение буфера, обнаруженное злоумышленником в этой библиотеке.
К сожалению, нет никакого способа активно предотвратить это, кроме того, чтобы не допускать ввода с клиентской стороны вообще.
Образец кода:
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?