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['файл']['тип'] проверяет только расширение файла, а не исходный тип файла.

Следующий код взят из 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, может кто-нибудь подтвердить мою идею? Спасибо!

 5
Author: nut, 2013-03-25

3 answers

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

 5
Author: icktoofay, 2013-03-24 22:49:40

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

 7
Author: darthmaim, 2013-03-24 22:54:01

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

 1
Author: Lucas Freitas, 2013-03-24 23:24:06