Я начинающий 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».
Ваш новый код просто проверяет расширение и не выполняет двойную проверку.
Ваш новый код проверяет только расширение файла и размер файла. Он не проверяет тип файла.
Я настоятельно рекомендую использовать старый код, потому что он также проверяет тип файла.