GetImageSize () не возвращает FALSE, когда это должно

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

Когда сценарий опубликован, я могу напечатать массив с помощью

<code>foreach ($_FILES['images']['name'] as $key => $value){             
        print_r(getimagesize($_FILES['images']['tmp_name'][$key]));
</code>

Это прекрасно работает, поэтому не возвращает false. Но даже если я загружу файл, который не является изображением, он не выдаст false. Он просто ничего не возвращает, а остальная часть моего сценария просто обрабатывает объект как изображение.

Может кто-нибудь сказать мне, что я делаю не так?

Ответы на вопрос(5)

Загрузить

getimagesize на$_FILES['images']['tmp_name'][$key] напрямую .. прежде чем использовать его, вам нужно сначала скопировать его в свою систему

Используйте$_FILES['images']['size'][$key] временно

Ил

  move_uploaded_file($_FILES['images']['tmp_name'][$key], $destination);
  print_r(getimagesize($destination));
Ложное изображение

Пожалуйста, не так$_FILES['images']['type'][$key] можно подделать

Использование поддельных заголовков изображений

Приме

file_put_contents("fake.png", base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABGdBTUEAALGPC/xhBQAAAAZQTFRF////
AAAAVcLTfgAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH0gQCEx05cq
KA8gAAAApJREFUeJxjYAAAAAIAAUivpHEAAAAASUVORK5CYII='));

Загрузкаfake.png

array
  'name' => 
    array
      0 => string 'fake.png' (length=8)
  'type' => 
    array
      0 => string 'image/png' (length=9)
  'tmp_name' => 
    array
      0 => string 'C:\Apache\xampp\tmp\php44F.tmp' (length=30)
  'error' => 
    array
      0 => int 0
  'size' => 
    array
      0 => int 167
Validate Image

Использовани

var_dump ( getimagesizeReal ( "fake.png" ) );

Используемая функция

function getimagesizeReal($image) {

    $imageTypes = array (
            IMAGETYPE_GIF,
            IMAGETYPE_JPEG,
            IMAGETYPE_PNG,
            IMAGETYPE_SWF,
            IMAGETYPE_PSD,
            IMAGETYPE_BMP,
            IMAGETYPE_TIFF_II,
            IMAGETYPE_TIFF_MM,
            IMAGETYPE_JPC,
            IMAGETYPE_JP2,
            IMAGETYPE_JPX,
            IMAGETYPE_JB2,
            IMAGETYPE_SWC,
            IMAGETYPE_IFF,
            IMAGETYPE_WBMP,
            IMAGETYPE_XBM,
            IMAGETYPE_ICO 
    );
    $info = getimagesize ( $image );
    $width = @$info [0];
    $height = @$info [1];
    $type = @$info [2];
    $attr = @$info [3];
    $bits = @$info ['bits'];
    $channels = @$info ['channels'];
    $mime = @$info ['mime'];

    if (! in_array ( $type, $imageTypes )) {
        return false; // Invalid Image Type ;
    }
    if ($width <= 1 && $height <= 1) {
        return false; // Invalid Image Size ;
    }

    if($bits === 1)
    {
        return false; // One Bit Image .. You don't want that  ;
    }
    return $info ;
}
 Baba05 мая 2012 г., 21:04
Это легко обмануть ...getimagesize лучший вариант, который я видел до сих пор @ Джейми Бикнелл
 Jamie Bicknell05 мая 2012 г., 21:02
Или вы можете использовать $ _FILES ['images'] ['type'] [$ key], чтобы проверить тип MIME, чтобы убедиться, что это image / png, image / gif ... и т. Д. Перед загрузкой.
 user136291605 мая 2012 г., 20:58
Ага, я понимаю, что ты имеешь в виду! Не думал об этом. Я попробую прямо сейчас.
 user136291605 мая 2012 г., 20:55
Да, но я не хочу перемещать загруженный файл, если я не уверен на 100%, что это изображение
 Baba05 мая 2012 г., 20:56
сначала вы помещаете его во временную директорию .. если это недопустимое изображение, используйтеunlink чтобы удалить его

getimagesize() при принятии решения о размещении загруженного файла в любом месте корня документа. Это потому, что PHP-код встроен в GIF-файлы (с названиемimage.gif.php) будет обозначаться как изображения какgetimagesize(), но их обслуживание будет запускать код PHP внутри них в дополнение к отображению изображения.Во это еще немного информации по этому вопросу.

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

images'] ['tmp_name'], так что это не проблема.

Если вы хотите проверить, является ли файл изображением, попробуйте следующее:

if(isset($_POST['submit'])) {
    $check = getimagesize($_FILES['images']['tmp_name']);
    if($check !== false) {
        echo 'File is an image - ' . $check['mime'];
    }
    else {
        echo 'File is not an image';
    }
}
 Jamie Bicknell05 мая 2012 г., 21:42
@ user1362916 Вы точно скопировали мой код, так как у меня есть тип и я использовал $ _FILES ['image'] вместо ваших $ _FILES ['images']. Сейчас обновлю сниппет
 user136291605 мая 2012 г., 22:01
да, я изменил изображение на изображения, результатов нет
 user136291605 мая 2012 г., 21:31
Я использовал именно ваш код (в цикле foreach), но он ВСЕГДА возвращаемый файл не является изображением, независимо от того, верный он или нет =

$_FILES['images']['type'] это даст вам тип загруженного файла. Затем проверьте его снова в октатном потоке или другом исполняемом файле. Если так, то не позволяйте.

@ user1362916 Если вы загружаете несколько изображений в формате HTML, возможно, вам нужно добавить еще один массив, подобный этому.

    $check = getimagesize($_FILES['images']['tmp_name'][$i]);
    if($check !== false) {
        echo 'File is an image - ' . $check['mime'];
    }
    else {
        echo 'File is not an image';
    }
}

Вот здесь [i], потому что это для загрузки нескольких файлов.

Ниже полный сценарий

<!DOCTYPE html>
<html>
<body>

<form action="#" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input name="my_files[]" type="file" multiple="multiple" />
    <input type="submit" value="Upload Image" name="submit">
</form>


<?php

 if (isset($_FILES['my_files']))
 {
    $myFile = $_FILES['my_files'];
    $fileCount = count($myFile["name"]);


        for ($i = 0; $i <$fileCount; $i++)
         {
           $error = $myFile["error"][$i]; 

            if ($error == '4')  // error 4 is for "no file selected"
             {
               echo "no file selected";
             }
            else
             {
               
                 $check = getimagesize($_FILES['my_files']['tmp_name'][$i]);
                 if($check !== false) {
                 echo 'File is an image - ' . $check['mime'];
                 }
                 else {
                 echo 'File is not an image';
                   }
                 }

             }
       }  
 }
        ?>


</body>
</html>

Ваш ответ на вопрос