验证文件是否为PHP中的图片

验证文件是否为PHP中的图片,php,image,security,validation,Php,Image,Security,Validation,如果文件上载到服务器,是否有办法使用PHP确保它实际上是一张图片,而不仅仅是一个扩展名为.jpg或.gif的文件?使用GD库的(部分) 如果没有图像,数组的第一个元素将是0 如果您没有安装GD(大多数情况下您会安装),您可以将文件头读取为 编辑: 实际上,正如Neal在评论中指出的那样,GD库甚至不需要使用此函数。所以使用它。最有效的方法是查看文件的开始字节并测试“幻数”文件说明符 记录在案:现在2013年+我们可以: 最大兼容性(如果您没有GD库)。 使用始终可用的((PHP4>=4.3.0

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

使用GD库的(部分)

如果没有图像,数组的第一个元素将是0

如果您没有安装GD(大多数情况下您会安装),您可以将文件头读取为

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

最有效的方法是查看文件的开始字节并测试“幻数”文件说明符

记录在案:现在2013年+我们可以:

最大兼容性(如果您没有GD库)。
使用始终可用的((PHP4>=4.3.0,PHP5))


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

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;
}

更多信息:

头检查不足以检查图像文件的有效性。 PHP文档清楚地表明,您不应该使用
getimagesize
检查给定文件是否为有效图像。看

我使用以下函数验证图像文件:

/**
*如果$path是有效的图像文件,则返回TRUE
*
*@param string$path
*@returnbool
*/
公共静态函数isImage(字符串$path)
{
如果(!是可读的($path)){
返回false;
}
//看https://www.php.net/manual/en/function.exif-imagetype.php 常数
//根据需要调整此阵列
$supported=[IMAGETYPE_GIF、IMAGETYPE_JPEG、IMAGETYPE_PNG];
$type=exif\u imagetype($path);
//$type可以有效,但不“受支持”
如果(!in_数组($type,$supported)){
返回false;
}
//检查图像内容,标题检查不够
$image=false;
交换机($类型){
案例图像类型\u GIF:
$image=@imagecreatefromformgif($path);
打破
案例IMAGETYPE_PNG:
$image=@imagecreatefrompng($path);
打破
case IMAGETYPE_JPEG:
$image=@imagecreatefromjpeg($path);
打破
}
返回(!!$image);
}

这将比启动GD更有效,但我认为使用二进制打开等等。。这对大多数人来说有点过头了。如果这是真的,那就太令人失望了。这里的大多数人不是都有CS学位吗?我没有。。但我从7岁起就一直在写代码。令人惊讶的是,许多人可以在不知道自己应该做什么的情况下获得学位。我是凭经验说的,因为我确实有土木工程学位,而且我知道很多“滑梯”刚刚滑过。学位没有任何意义。证明你们可以有所作为。哦,我相信这个网站的大量用户并没有CS学位。大多数人都是从谷歌来到这里的,他们试图学习他们正在学习的语言。同意——我亲眼目睹了这一点。然而,想到从事编程工作的人(我想他们中的很多人都是这样做的)以及二进制打开是他们无法理解的,这仍然令人失望。@Neal-事实上,我没有!我不知道。谢谢你指出这一点。答案已编辑。这不是我第一次遇到麻烦了,我很乐意帮忙!使用
exif\u imagetype
更好更快。官方文档说“不要使用getimagesize()检查给定文件是否为有效图像”此函数运行速度太慢。您有什么更好的主意吗?作为一个更新,现在已经弃用了:仍然适用于PHP7,请不要使用
getimagesize()
检查给定文件是否为有效图像。
$type = mime_content_type($filename);
if (strstr($type, 'image/'))
{
    echo 'is image';
}
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;
}