самый надежный способ проверить файл загрузки — это изображение

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

$whitelist_type = array('image/jpeg', 'image/png','image/gif');
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);

if (!in_array(finfo_file($fileinfo, $file['tmp_name']), $whitelist_type)) {
$error[]  = "Uploaded file is not a valid image";
}

и второй код:

if (!getimagesize($_FILES['photo']['tmp_name'])) {
$error[]  = "Uploaded file is not a valid image";
}

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

2

Решение

finfo_* библиотека была бы хороша, но она будет работать с> = 5.3.0 версии,

А ТАКЖЕ getimagesize() GD функция библиотеки, которая возвращает информацию об изображении WxH а также size

если изображение неверно, то getimagesize() показать предупреждение, так что лучше использовать для проверки изображения с помощью finfo_* функция,

Вы также можете сделать для кросс-версии кода, см. ниже пример кода

<?php
$file = $_FILES['photo'];
$whitelist_type = array('image/jpeg', 'image/png','image/gif');
$error = null;
if(function_exists('finfo_open')){    //(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);

if (!in_array(finfo_file($fileinfo, $file['tmp_name']), $whitelist_type)) {
$error[]  = "Uploaded file is not a valid image";
}
}else if(function_exists('mime_content_type')){  //supported (PHP 4 >= 4.3.0, PHP 5)
if (!in_array(mime_content_type($file['tmp_name']), $whitelist_type)) {
$error[]  = "Uploaded file is not a valid image";
}
}else{
if (!@getimagesize($file['tmp_name'])) {  //@ - for hide warning when image not valid
$error[]  = "Uploaded file is not a valid image";
}
}
4

Другие решения

Почему бы не использовать exif_imagetype:

if (exif_imagetype($file['tmp_name']) != (IMAGETYPE_JPEG || IMAGETYPE_GIF || IMAGETYPE_PNG)) {
$error[]  = "Uploaded file is not a valid image";
}

Это, вероятно, будет быстрее, чем любой другой. (PHP 4> = 4.3.0, PHP 5)

2

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

Вы могли бы использовать один из тех imagecreatefrom...() функции от Библиотека GD, на основе типа MIME, который вы обнаружили, например, от $_FILES массив и / или из exif_imagetype(), finfo_file() и т.п.

Проблема в том, что есть некоторые эксплойты, которые притворяются действительными изображениями (а в некоторых случаях являются допустимые изображения), но также являются допустимыми JavaScript, Flash или другими контейнерами кода, которые могут запускаться браузером клиента при определенных обстоятельствах.

Смотрите также, например, https://www.defcon.org/images/defcon-15/dc15-presentations/dc-15-schrenk.pdf

2
По вопросам рекламы [email protected]