php图片上传检测是否为真实图片格式

PHP 图片上传,如果不做任何判断的话,随便一个文件如 rar,zip,php,java等文件改个文件名,改个后缀就能以图片形式上传的服务器,往往会造成极大的危害!

第一种方法:如果是只是单纯判断是否是图片格式的话,我使用  getimagesize 方法

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

  2. if(isImage('test.jpg')!==false){
            echo '是图片';
          }else{
             echo '不是';
          }

  3. 第二种方法比较强大一些,能判断多种格式

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

  5. 第三种方法:

  6. PHP  gd类库函数提供了一个exif_imagetype() 函数, 用来读取图像的第1个字节, 还会对图片的签名做检查。 如果格式不对,会返回false。 其实啊, 这个方法和第一种方法有异曲同工之妙。 但是因为这个是库函数,效率要比第一种方法高得多。此函数用法很简单,传入路径,然后通过判断是否等于某个常量,  例如 gif格式的IMAGETYPE_GIF

  7. if(exif_imagetype("image.gif")!=IMAGETYPE_GIF){
          echo "The picture is not a gif";
        }
  8. 第四种方法: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;
              }
        }
  9. 总结: 我曾经在网上看到过有人说:相信懂得php的人都用过XX函数。 我打开一看,就是一个使用后缀来判断上传类型的函数。 同学在做类似功能的时候一定要揭开表现看到本质,否则经过伪装的图片在上传之后,会对服务器造成极大安全隐患。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值