Правильный способ проверки загрузки файлов в PHP - в том числе изменение пользовательского расширения файла?

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

Я использую следующее, чтобы разрешать загрузку только файлов определенного типа:

$allowed_ext = array("jpeg", "jpg", "gif", "png");

$tmp_ext = explode(".", $_FILES["file"]["name"]);
$ext = strtolower(end($tmp_ext));

if ((($_FILES["file"]["type"] == "image/jpeg")
 || ($_FILES["file"]["type"] == "image/jpg")
 || ($_FILES["file"]["type"] == "image/gif")
 || ($_FILES["file"]["type"] == "image/png"))
&& in_array($ext, $allowed_ext)) {
 //Continue
} else {
 //Don't allow
}

Но предотвращает ли это изменение всех типов пользователей для всех пользователей? например, если пользователь изменил расширение файла на что-то вредоносное на.jpeg или.png - это предотвратит это?

Я не могу найти никаких сообщений, разъясняющих это, поэтому любая помощь будет оценена!

2 ответа

Короткий ответ, нет, вы не можете полагаться на тип MIME. Клиент и клиент предоставляет тип и расширение файла.

Похоже, вы можете использовать getimagesize() для проверки изображения, кредит на этот поток: PHP: $ _FILES ["file"] ["type"] бесполезен


  1. Возьмите расширение файла и сопоставьте его с типом файла, если они не совпадают: сбой.
  2. Используя формат файла, указанный типом расширения /MIME, вызовите соответствующую функцию imagecreatefrom*() из библиотеки GD. Если это что-то иное, кроме изображения типа, указанного типом extension/MIME, функция вернет false.

licensed under cc by-sa 3.0 with attribution.