определение типа изображения php

#php

#php

Вопрос:

Не удается определить тип mime. если я удалю ($mime=="image/jpeg" || $mime=="image/pjpeg") , это может привести к успешной загрузке изображения.

 $mime = $_FILES['Filedata']['type'];
if((!empty($_FILES['Filedata']['tmp_name'])) amp;amp; ($_FILES['Filedata']['error'] == 0)) {
  $filename = basename($_FILES['Filedata']['name']);
  $ext = pathinfo($filename, PATHINFO_EXTENSION);
  if (($ext=="jpg" || $ext=="jpeg") amp;amp; ($mime=="image/jpeg" || $mime=="image/pjpeg") amp;amp; ($_FILES["Filedata"]["size"] < 350000)) {
        $newname = $filename;
        if (!file_exists($newname)) {
            if (move_uploaded_file($_FILES['Filedata']['tmp_name'], "./photo/" . $newname)) {
                echo "It's done! The file has been saved as: ".$newname;
            } else {
                echo "Error: A problem occurred during file upload!";
            }
        } else {echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";}
  } else {
     echo "Error: Only .jpg images under 350Kb are accepted for upload";
  }
} else {
    echo "Error: No file uploaded";
}
  

Комментарии:

1. Вы не должны полагаться на тип, переданный из браузера. Используйте getimagesize() вместо

Ответ №1:

name и type Информация для загруженных файлов должна рассматриваться как чисто информационная и никогда не использоваться для чего-либо серьезного, поскольку это информация, предоставленная пользователем, и ее можно легко подделать. Вам следует смотреть только на поля tmp_name , error и size , чтобы определить, хотите ли вы принять файл. Чтобы найти фактический MIME-тип файла, используйте встроенные функции PHP:

 if ($file['error'] == UPLOAD_ERR_NO_FILE) {
    die('No file uploaded');
}

if ($file['error'] != UPLOAD_ERR_OK) {
    die('Error during upload');
}

if (!$file['size'] || !is_uploaded_file($file['tmp_name'])) {
    die('File is weird');
}

$extensions = array(IMAGETYPE_GIF => '.gif', IMAGETYPE_JPEG => '.jpg', IMAGETYPE_PNG => '.png');
$exifType = exif_imagetype($file['tmp_name']);
if (!isset($extensions[$exifType])) {
    die('Unsupported file type');
}

$ext = $extensions[$exifType];
$targetDir = '/somewhere/else/';

do {
    $target = $targetDir . uniqid() . $ext;
} while (file_exists($target));

if (!move_uploaded_file($file['tmp_name'], $target)) {
    die('Something went wrong');
}

echo 'Yay, uploaded!';
  

Не то чтобы вам обязательно следовало использовать такое количество die() инструкций, это просто для демонстрационных целей.

Комментарии:

1. exif состоит из информации заголовка в изображении? Что произойдет, если пользователь удалит информацию, вставленную Photoshop?

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

3. Я понимаю, но как откуда берется файл $? Разве нам не нужен [‘fileData’]? Не могли бы вы также показать мне загрузку HTML?

4. @Macris Это всего лишь краткий пример, просто представьте, что я сделал $file = $_FILES['Filedata'] .;

5. о, отлично, другим наиболее безопасным способом, который я могу придумать, является использование ImageMagick для чтения и записи нового изображения, это удалит все скрытые данные и позволит избежать сохранения вредоносного кода. Действительно ценю ваш код, я спешу развернуть свой веб-сайт!