PHP: $ _FILES бесполезен

Я использую var_dump(@$_FILES['file']['type']) чтобы проверить тип файла, который я загрузил

Во-первых, я загрузил exe file под названием « uninstall.exe », и он вернулся

 "string 'application/octet-stream' (length=24)" 

Затем я переименовал этот файл в uninstall.png , он вернулся

 string 'image/png' (length=9) 

Мой вывод: $ _FILES ['file'] ['type'] проверяет только расширение файла, а не тип исходного файла.

Следующий код из w3cschool :

 $allowedExts = array("gif", "jpeg", "jpg", "png"); $extension = end(explode(".", $_FILES["file"]["name"])); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts)) 

Я думаю, что $_FILES["file"]["type"] в вышеуказанных кодах не является необходимым, мы можем просто проверить расширение файла с помощью explode() и in_array

Я просто начинающий php, может кто-то подтвердить мою идею? Благодаря!

Вы абсолютно правы. Тип MIME предоставляется клиентом, и вы не можете гарантировать его правильность. В этом отношении, так же как и расширение файла. Если вам нужно быть абсолютно уверенным, вам нужно посмотреть содержимое файла.

Если вы хотите быть уверенным, что изображение было загружено, используйте getimagesize , который возвращает 0 для не-изображений.

Вы должны использовать оболочку расширений GD или Imagick. Очень хороший – WideImage .