codetc - 网站开发技术 首页 代码 PHP 查看内容

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

2015-3-25 22:18| 发布者: CODETC| 查看: 4218| 评论: 0

用PHP做上传文件功能时,一般限制可上传的文件类型的做法是通过文件的后缀进行判断,但这样的做法存在缺点,相信所有的phper们都是知道的,只要修改一下文件后缀,各种文件皆可上传。


下面我们提供一个通过读取文件头来判断文件类型的方法,但是读文件头是不能真实判断文件类型的,判断文件类型,是一个很复杂的工作,下面是php读文件头判断文件类型的代码,但是不精准,可以作为参考。


简要分析一下本函数通过文件头信息实现判断上传文件类型的过程思路,首先使用用fopen()函数打开上传的文件,然后通过fread()读取文件的前2个字节。得到的内容会是二进制的字符串,为了能在程序代码中做判断,这里使用的是unpack()函数把二进制数据转换成十进制数字的字符串(unpack()函数主要用于二进制操作,具体用法可参见php帮助文档,这里不做解释!),然后进行判断即可。


下面直接把案例代码贴出来吧:

<?php   

/**
 * @author http://www.codetc.com
 * @param $string
 */

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

一直以来,对于上传文件类型的判断都没有太好的办法,即使使用上面的代码,也有办法构造假的图片,自行构造这里就不说了。

文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-163-1.html

最新评论

 作为游客发表评论,请输入您的昵称

返回顶部