GetImageSize () не возвращает FALSE, когда он должен

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

Когда скрипт отправлен, я могу напечатать массив с помощью

foreach ($_FILES['images']['name'] as $key => $value){ print_r(getimagesize($_FILES['images']['tmp_name'][$key])); 

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

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Загрузить

вы не можете использовать getimagesize на $_FILES['images']['tmp_name'][$key] напрямую .. вам нужно скопировать его в вашу систему прежде, чем вы сможете его использовать

Использовать $_FILES['images']['size'][$key] временно

Или

  move_uploaded_file($_FILES['images']['tmp_name'][$key], $destination); print_r(getimagesize($destination)); 

Поддельное изображение

Пожалуйста, не то, что $_FILES['images']['type'][$key] можно подделать

Использование поддельных заголовков изображений

пример

 file_put_contents("fake.png", base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABGdBTUEAALGPC/xhBQAAAAZQTFRF//// AAAAVcLTfgAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH0gQCEx05cq KA8gAAAApJREFUeJxjYAAAAAIAAUivpHEAAAAASUVORK5CYII=')); 

Загрузка fake.png

 array 'name' => array 0 => string 'fake.png' (length=8) 'type' => array 0 => string 'image/png' (length=9) 'tmp_name' => array 0 => string 'C:\Apache\xampp\tmp\php44F.tmp' (length=30) 'error' => array 0 => int 0 'size' => array 0 => int 167 

Проверить изображение

Применение

 var_dump ( getimagesizeReal ( "fake.png" ) ); 

Используемая функция

 function getimagesizeReal($image) { $imageTypes = array ( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_SWF, IMAGETYPE_PSD, IMAGETYPE_BMP, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM, IMAGETYPE_JPC, IMAGETYPE_JP2, IMAGETYPE_JPX, IMAGETYPE_JB2, IMAGETYPE_SWC, IMAGETYPE_IFF, IMAGETYPE_WBMP, IMAGETYPE_XBM, IMAGETYPE_ICO ); $info = getimagesize ( $image ); $width = @$info [0]; $height = @$info [1]; $type = @$info [2]; $attr = @$info [3]; $bits = @$info ['bits']; $channels = @$info ['channels']; $mime = @$info ['mime']; if (! in_array ( $type, $imageTypes )) { return false; // Invalid Image Type ; } if ($width <= 1 && $height <= 1) { return false; // Invalid Image Size ; } if($bits === 1) { return false; // One Bit Image .. You don't want that ; } return $info ; } 

Я бы рекомендовал не доверять результатам getimagesize() при принятии решения о размещении загруженного файла в любом месте вашего корня документа. Это связано с тем, что PHP-код, встроенный в файлы GIF (под названием image.gif.php ), будет идентифицироваться как изображения с помощью getimagesize() , но при их обслуживании будет запущен PHP-код внутри них в дополнение к отображению изображения. Вот еще информация о проблеме.

В приведенной выше статье рекомендуется настроить отдельный контроллер, через который будут загружены все загруженные пользователем файлы. Файлы, считанные с readfile() , не обрабатываются при доступе через локальную файловую систему.

Во-первых, вы можете использовать getimagesize на $ _FILES ['images'] ['tmp_name'], так что это не проблема.

Если вы хотите проверить, является ли файл изображением, попробуйте следующее:

 if(isset($_POST['submit'])) { $check = getimagesize($_FILES['images']['tmp_name']); if($check !== false) { echo 'File is an image - ' . $check['mime']; } else { echo 'File is not an image'; } } 

Вы можете просто использовать $_FILES['images']['type'] . он даст вам тип загруженного файла. Затем проверьте его снова в октатном потоке или другом исполняемом файле. Если это так, не разрешайте.

@ user1362916 Если вы загружаете несколько изображений с помощью HTML, возможно, вам нужно добавить еще один массив.

 if(isset($_POST['submit'])) { $check = getimagesize($_FILES['images']['tmp_name'][$i]); if($check !== false) { echo 'File is an image - ' . $check['mime']; } else { echo 'File is not an image'; } } 

Здесь проверьте [i], потому что это для загрузки нескольких файлов.

Ниже приведен полный сценарий

 <!DOCTYPE html> <html> <body> <form action="#" method="post" enctype="multipart/form-data"> Select image to upload: <input name="my_files[]" type="file" multiple="multiple" /> <input type="submit" value="Upload Image" name="submit"> </form> <?php if (isset($_FILES['my_files'])) { $myFile = $_FILES['my_files']; $fileCount = count($myFile["name"]); for ($i = 0; $i <$fileCount; $i++) { $error = $myFile["error"][$i]; if ($error == '4') // error 4 is for "no file selected" { echo "no file selected"; } else { if(isset($_POST['submit'])) { $check = getimagesize($_FILES['my_files']['tmp_name'][$i]); if($check !== false) { echo 'File is an image - ' . $check['mime']; } else { echo 'File is not an image'; } } } } } ?> </body> </html>