PHP 图片上传,如果不做任何判断的话,随便一个文件如 rar,zip,php,java等文件改个文件名,改个后缀就能以图片形式上传的服务器,往往会造成极大的危害!
第一种方法:如果是只是单纯判断是否是图片格式的话,我使用 getimagesize 方法
-
function checkIsImage($filename){
$alltypes = '.gif|.jpeg|.png|.bmp';//定义检查的图片类型
if(file_exists($filename)){
$info= getimagesize($filename);
$ext = image_type_to_extension($info['2']);
return stripos($alltypes,$ext);
}else{
return false;
}
} -
if(isImage('test.jpg')!==false){
echo '是图片';
}else{
echo '不是';
}
-
第二种方法比较强大一些,能判断多种格式
-
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 7790:
$fileType = 'exe';
break;
case 7784:
$fileType = 'midi';
break;
case 8297:
$fileType = 'rar';
break;
case 255216:
$fileType = 'jpg';
break;
case 7173:
$fileType = 'gif';
break;
case 6677:
$fileType = 'bmp';
break;
case 13780:
$fileType = 'png';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
-
第三种方法:
-
PHP gd类库函数提供了一个exif_imagetype() 函数, 用来读取图像的第1个字节, 还会对图片的签名做检查。 如果格式不对,会返回false。 其实啊, 这个方法和第一种方法有异曲同工之妙。 但是因为这个是库函数,效率要比第一种方法高得多。此函数用法很简单,传入路径,然后通过判断是否等于某个常量, 例如 gif格式的IMAGETYPE_GIF
-
第四种方法:php重绘
效率很低的一种方法,但也是一种思路: 把传输过来的文件,不论什么文件都以resource 类型绘到图片中去, 如果是图片,能还原出来。如果不是图片,那绘画不出来,而且里面的危险代码也没有了。
具体请看:
function isimage($imgpath){
if($imgpath['type']=="image/gif")
$img=imagecreatefromgif($imgpath['tmp_name']);
elseif($imgpath['type']=="image/png" || $imgpath['type']=="image/x-png")
$img=imagecreatefrompng($imgpath['tmp_name']);
else
$img=imagecreatefromjpeg($imgpath['tmp_name']);
if($img==false){
return false;
}else{
return true;
}
} -
总结: 我曾经在网上看到过有人说:相信懂得php的人都用过XX函数。 我打开一看,就是一个使用后缀来判断上传类型的函数。 同学在做类似功能的时候一定要揭开表现看到本质,否则经过伪装的图片在上传之后,会对服务器造成极大安全隐患。