1

在这里处理一个小上传脚本。我正在尝试检查上传的图像是否真的是图像,而不仅仅是重命名的 PHP 文件。

发布脚本后,我可以打印数组

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

这工作得很好,所以它不会返回假。但即使我上传一个不是图片的文件,它也不会给出假的。它根本不返回任何内容,而我的脚本的其余部分只是处理图像之类的东西。

谁能告诉我我做错了什么?

4

5 回答 5

4

上传

你不能直接使用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

验证图像

用法

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 ;
}
于 2012-05-05T18:52:07.580 回答
1

首先,您可以在 $_FILES['images']['tmp_name'] 上使用 getimagesize,所以这不是问题。

如果要检查文件是否为图像,请尝试以下操作:

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';
    }
}
于 2012-05-05T19:23:14.010 回答
1

getimagesize()在决定是否将上传的文件放在文档根目录中的任何位置时,我建议不要相信结果。这是因为嵌入在 GIF 文件中的 PHP 代码(标题image.gif.php是有关该问题的更多信息。getimagesize()

上面链接的文章建议设置一个单独的控制器,通过该控制器提供所有用户上传的文件。readfile()通过本地文件系统访问时,不会解析读取的文件。

于 2012-05-05T19:31:40.813 回答
0

您可以简单地使用$_FILES['images']['type']. 它会给你上传文件的类型。然后再次检查八进制流或其他可执行文件。如果是这样,那么不允许它。

于 2012-05-05T19:08:02.837 回答
0

@user1362916 如果您使用 HTML 上传多张图片,那么您可能需要再添加一个这样的数组。

if(isset($_POST['submit'])) {
    $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
             {
               if(isset($_POST['submit'])) {
                 $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>
于 2015-07-24T11:26:25.290 回答