有一次把文本文件的后缀名修改为图片的后缀名,然后试着上传到qq头像上,结果报出文件格式错误的错误
显然程序中只是单纯地判断文件的后缀名无法正确地判断图像的是否是真实的图像。下面给出几个方法来判断图像是否是伪造的。
1.使用getimagesize()方法
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
我们写如下代码:
$img = getimagesize("2.jpg");//真实图像
echo '真实图像';
var_dump($img);
$img = getimagesize("3.jpg");//txt类型转换为jpg类型
echo '伪造图像';
var_dump($img);
结果为:
有结果可见如果是真实的图像则返回一个数组,而伪造的图像则返回false。然后我们讨论一下该方法的返回结果:
1、图像的宽度的像素值。
2、图像的高度的像素值。
3、图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
4、宽度和高度的字符串,可以直接用于 HTML 的 标签
5、图像的每种颜色的位数,二进制格式
6、图像的通道值,RGB 图像默认是 3
7、图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header(“Content-type: image/jpeg”);
2.使用gd库中的exif_imagetype()函数
该函数读取一个图像的第一个字节并检查其签名。同样运行如下代码:
$img = exif_imagetype("2.jpg");//真实图像
echo '真实图像';
var_dump($img);
$img = exif_imagetype("3.jpg");//txt类型转换为jpg类型
echo '伪造图像';
var_dump($img);
同样经过伪造的图像会返回false。
返回结果与getimagesize()方法返回的数组中的索引 2 的值是一样的这里不再赘述,由于本函数是库函数快得多。
本例为实验性例子,读者可以构造出自己的方法方便调用。