验证文件是PHP中的图片

时间:2009-10-17 01:19:07

标签: php image security validation

如果文件上传到服务器,有没有办法使用PHP,以确保它实际上是一张图片,而不仅仅是一个.jpg或.gif扩展名的文件?

5 个答案:

答案 0 :(得分:14)

使用GD库的(部分)。

PHP: GD - Manual

array getimagesize ( string $filename [, array &$imageinfo ] )

如果没有图像,则数组的第一个元素为0。 PHP: getimagesize

如果您没有安装GD(大部分时间都可以),您可以将文件标题读作Shane mentioned

编辑: 实际上,正如Neal在评论中指出的那样, GD库甚至不需要使用此功能。所以使用它。

答案 1 :(得分:6)

检查文件是否为图像的最佳方法

function is_image($path)
{
    $a = getimagesize($path);
    $image_type = $a[2];

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
}

更多:http://www.binarytides.com/php-check-if-file-is-an-image/

答案 2 :(得分:4)

最有效的方法是查看文件的开头字节并测试'magic number'文件说明符。 Here is a list of magic numbers

答案 3 :(得分:0)

有关记录:现在在2013年以后我们可以:

最多兼容性(如果您没有GD库) 使用始终可用的mime-content-type((PHP 4> = 4.3.0,PHP 5))

$type = mime_content_type($filename);
if (strstr($type, 'image/'))
{
    echo 'is image';
}

答案 4 :(得分:0)

标头检查不足以检查图像文件的有效性。 PHP文档明确表示您不应该使用 /** * Returns TRUE if $path is a valid Image File * * @param string $path * @return bool */ public static function isImage(string $path) { if (!is_readable($path)) { return false; } // see https://www.php.net/manual/en/function.exif-imagetype.php for Constants // adjust this array to your needs $supported = [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG]; $type = exif_imagetype($path); // $type can be valid, but not "supported" if (!in_array($type, $supported)) { return false; } // check the image content, header check is not enough $image = false; switch ($type) { case IMAGETYPE_GIF: $image = @imagecreatefromgif($path); break; case IMAGETYPE_PNG: $image = @imagecreatefrompng($path); break; case IMAGETYPE_JPEG: $image = @imagecreatefromjpeg($path); break; } return (!!$image); } 来检查给定文件是否为有效映像。参见https://www.php.net/manual/en/function.getimagesize.php

我使用以下功能来验证图像文件:

{{1}}