Работаем с небольшим сценарием загрузки. Я пытаюсь проверить, действительно ли загруженное изображение является образом, а не только переименованным файлом 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>