分享

PHP判断上传文件类型(防修改后缀)

 青松卓然 2012-10-23

      网上流传着一种说法,用PHP读文件头部两个字节判断文件真实类型,其实这样判断也是不精确的,就拿office的文件类型来说。

      word以前的格式是storage方式存储,但是现在最新版本的docx是一个zip包。

      即使是以前的storage方式存储的格式,也不能确定就是word文档,因为qq聊天记录也是采用这种方式存储的。所以,如果从文件格式分析的话,将会是很复杂的事情,但是可以实现精确的判断是不是word文档


      比如,读取storage结构,判断里面的子节点名字,如果是docx格式,先用zlib解压,再判断里面的xml文件和目录名字,等等,其他office格式类似。


      从上面一个简单的判断,我们可以得知,读文件头是不能真实判断文件类型的,判断文件类型,是一个很复杂的工作,下面是php读文件头判断文件类型的代码,但是不精准,可以作为参考。不过,除了office,其他还是挺准的。

 

 

Php代码  收藏代码
  1. <?php     
  2.   
  3. function file_type($filename)  
  4. {  
  5.     $file = fopen($filename"rb");  
  6.     $bin = fread($file, 2); //只读2字节  
  7.     fclose($file);  
  8.     $strInfo = @unpack("C2chars"$bin);  
  9.     $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);  
  10.     $fileType = '';  
  11.     switch ($typeCode)  
  12.     {  
  13.         case 7790:  
  14.             $fileType = 'exe';  
  15.             break;  
  16.         case 7784:  
  17.             $fileType = 'midi';  
  18.             break;  
  19.         case 8297:  
  20.             $fileType = 'rar';  
  21.             break;          
  22.         case 8075:  
  23.             $fileType = 'zip';  
  24.             break;  
  25.         case 255216:  
  26.             $fileType = 'jpg';  
  27.             break;  
  28.         case 7173:  
  29.             $fileType = 'gif';  
  30.             break;  
  31.         case 6677:  
  32.             $fileType = 'bmp';  
  33.             break;  
  34.         case 13780:  
  35.             $fileType = 'png';  
  36.             break;  
  37.         default:  
  38.             $fileType = 'unknown: '.$typeCode;  
  39.     }  
  40.   
  41.     //Fix  
  42.     if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';  
  43.     if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';  
  44.   
  45.     return $fileType;  
  46. }  
  47.   
  48. echo file_type('start.php');   // 6063 or 6033  
 


但是我不知道反过来定义 6063或者6033 就是指php的话 是不是不够严谨啊。

 

对于上传文件类型的判断,一直没有太好的办法,即使使用上面的代码,也有办法构造假的图片 的(如何构造不再传播),有人使用getimagesize来判断,不失为一种好办法:

 

Php代码  收藏代码
  1. if(in_array($attach['ext'], array('jpg''jpeg''gif''png''swf''bmp')) && function_exists('getimagesize') && !@getimagesize($target))   
  2. {  
  3.     unlink($target);  
  4.     upload_error('post_attachment_ext_notallowed'$attacharray);  
  5. }  
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多