`
天梯梦
  • 浏览: 13639251 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

阅读更多

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

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

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


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


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

 

 

<?php   

function file_type($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 8075:
            $fileType = 'zip';
            break;
        case 255216:
            $fileType = 'jpg';
            break;
        case 7173:
            $fileType = 'gif';
            break;
        case 6677:
            $fileType = 'bmp';
            break;
        case 13780:
            $fileType = 'png';
            break;
        default:
            $fileType = 'unknown: '.$typeCode;
    }

	//Fix
	if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
	if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';

    return $fileType;
}

echo file_type('start.php');   // 6063 or 6033
 


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

 

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

 

if(in_array($attach['ext'], array('jpg', 'jpeg', 'gif', 'png', 'swf', 'bmp')) && function_exists('getimagesize') && !@getimagesize($target)) 
{
    unlink($target);
    upload_error('post_attachment_ext_notallowed', $attacharray);
}
 

 

 

 

 

分享到:
评论

相关推荐

    PHP使用finfo_file&#40;&#41;函数检测上传图片类型的实现方法

    在我们的Web应用中,比如用户上传头像,要求是png,jpg,gif格式,接收到图片后会根据图片格式类型做不同的头像切割处理,但个别用户会传一些只更改过文件后缀的非标准图片,比如nowamagic.jpg 强行修改成 nowamagic....

    php判断文件上传图片格式的实例详解

    php判断文件上传图片格式的实例详解 判断文件图片类型, $type = $_FILES['image']['tmp_name'];//文件名 //$type = $this-&gt;getImagetype( $type ); $filetype = ['jpg', 'jpeg', 'gif', 'bmp', 'png']; if (! ...

    PHP开发实战1200例源码

    实例122 判断上传文件的类型 153 实例123 判断邮政编码格式是否正确 154 2.10 数组 154 实例124 创建并输出数组 155 实例125 统计数组元素个数 156 实例126 向数组中添加元素 156 实例127 将数组中指定索引位置的...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例122 判断上传文件的类型 153 实例123 判断邮政编码格式是否正确 154 2.10 数组 154 实例124 创建并输出数组 155 实例125 统计数组元素个数 156 实例126 向数组中添加元素 156 实例127 将数组中指定索引位置的...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例122 判断上传文件的类型 153 实例123 判断邮政编码格式是否正确 154 2.10 数组 154 实例124 创建并输出数组 155 实例125 统计数组元素个数 156 实例126 向数组中添加元素 156 实例127 将数组中指定索引位置的...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个...

    zswin社交类博客系统1.6.4

    7、后台设置风格主题和URL模式,网页后缀名和间隔符号,增加了自动判断URL链接机制,后台更改模式后,前台自动替换各个链接! 8、增加了success、error和404页面 修复: 1、解决了uploadify上传插件与chrome...

    5556短网址压缩程序 2.1.zip

    5556短网址压缩程序 2.1 新增功能: 判断访客输入的网址是否正确的功能 安装说明: 将文件上传的您的服务器→将程序所在目录权限设置为0777...安装后,程序自动生成 config.php 配置文件,以后可以直接在里面修改

    投票系统 - 2.5 bgk

    ├─找到calendar_SC_UTF8.js或者calendar_TC_UTF8.js等后缀与你论坛编码相对应的JS文件 ├─改名为calendar.js覆盖上传到插件对应目录即可 ├─后台更新缓存 /******************** 历史更新记录 **************...

    Guojiz网址导航系统

    添加分类添加本站运行多少天代码后台设置安装时间网址#后缀自定义修改首页滚动公告修复工具点击无效修复手机端ico显示新增顶部时间开关修改不少小细节快来体验吧2019年6月26更新如下后台添加控制pc首页模块显示可一...

    YiiPiN社会化电商分享系统 v1.3.zip

    系统对商品分享自动进行中文分词生成标签,并可自动判断宝贝所属分类,降低了分享的复杂度和管理的工作量。 系统采用向导式安装程序,无经验的站长用户也可以轻松完成安装部署。 系统设计了大量自定义功能,所有...

Global site tag (gtag.js) - Google Analytics