Intereting Posts
proc_open возвращает false, но не записывает в файл ошибки – проблема с правами? конфликты с несколькими формами: codeigniter conflict Андроид php отправляет строку вместе с многочастными данными Laravel UTF-8 для базы данных PHP ZipArchive поврежден в Windows PHP – синтаксический анализ данных многочастной формы Поделитесь СЕССИЕЙ на нескольких серверах с разными доменами Библиотеки и псевдокод для физической панели мониторинга / состояния AES шифруется в Node.js Расшифровывать в PHP. Потерпеть неудачу. 403 при отправке сообщений в разъем facebook через API-интерфейс Unification Engine Планировщик Laravel запускается дважды Ежедневно в определенные часы Если вы включите файл в PHP в цикле, он будет обращаться к файлу каждый раз, когда он будет работать в цикле? Неизвестная функция в PHP Netbeans – как подавить? загрузите текстовый файл вместо открытия в браузере Каков самый простой способ добавления сервлетов Java на WAMP-настроенную машину?

PHP Проверка загрузки файла

Я начинающий PHP и в настоящее время изучаю часть «Проверка загрузки файлов».

Я сделал страницу test.php, содержащую следующий код:

var_dump(@$_FILES['file']['type']); 

Во-первых, я загрузил изображение «img.gif», и он вернулся:

 string 'image/gif' (length=9) 

Затем я изменил расширение изображения на «.jpg», и он вернулся:

 string 'image/jpeg' (length=10) 

Поэтому я понял, что $ _FILES ["file"] ["type"] возвращает только расширение загруженного файла, но на самом деле не проверял, какой именно файл.

На этой странице, http://www.w3schools.com/php/php_file_upload.asp , есть код:

 $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)) 

Мне интересно, почему выше коды проверяют расширение файла дважды? Я удалил некоторые из предыдущих кодов, и это мой новый код:

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

Правильно ли мой код? Или у вас есть какие-то лучшие способы проверки файла загрузки – это изображение?

Благодаря!

Вы должны передать tmp_name файла * в getimagesize , он даст вам размер и тип изображения (если это изображение). Если переданный аргумент – это файл, но не изображение, оно возвращает false, что позволит вам проверить.

Изменить. Единственный надежный метод проверки изображения – сделать копию его с помощью GD или Imagick – getimagesize можно легко взломать .

*: Я имею в виду, временный файл, созданный после загрузки.

Например:

 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $file = $_FILES['file']['tmp_name']; if (file_exists($file)) { $imagesizedata = getimagesize($file); if ($imagesizedata === FALSE) { //not image } else { //image //use $imagesizedata to get extra info } } else { //not file } } 

Этот код использует file_exists только для того, чтобы быть общим. Если файл не был загружен, вы получите $_FILES['file']['size'] = 0 , $_FILES['file']['tmp_name'] = '' и $_FILES['file']['error'] = 4 . См. Также is_readable . Для значений ошибок см. Ошибки загрузки файлов, описанные на php.net .

 $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)) 

Это проверяется дважды, потому что расширение файла и типа файла может отличаться, поэтому кто-то не может загрузить исполняемый файл с расширением .png.

В вашем модифицированном коде можно загрузить файл другого типа с измененным расширением. например, они могут загрузить документ с расширением «.png».

Ваш новый код просто проверяет расширение и не выполняет двойную проверку.

Ваш новый код проверяет только расширение файла и размер файла. Он не проверяет тип файла.

Я настоятельно рекомендую использовать старый код, потому что он также проверяет тип файла.