判断用户上传的图片为正常的图片

巴扎黑
发布: 2016-11-11 13:35:01
原创
1374 人浏览过

文件上传是我们常常需要开发的功能,试试用最安全的方式,判断用户上传的图片为正常的图片(JPG\GIF\PNG)。

 

解题思路:
1、检查提交的文件的扩展名是否是图片(这一步很容易伪造的,所以不可靠)
2、依据文件的头信息检查文件是否真的是图片 (这一步基本就是图片了,但是依然可能包含木马的脚本)
3、用正则检查文件里面是否包含木马的脚本

 

以下是“坚持到底”的PHP版本代码   

<?php
//允许的图片类型
$imageType = array(&#39;jpg&#39;,&#39;gif&#39;,&#39;png&#39;);
//上传后存放的路径
$uploadfile = &#39;./data/&#39; . basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]);
//获取文件的扩展名
$finfo = new SplFileInfo($_FILES[&#39;userfile&#39;][&#39;name&#39;]);
$extName=$finfo->getExtension();
//第一道关卡,简单过滤非法文件。
if(!in_array($extName,$imageType)){
    exit(&#39;只能上传gif、png和jpg的图片&#39;);
}
//依据文件头信息检查图片的真实类型
//1 IMAGETYPE_GIF 
//2 IMAGETYPE_JPEG 
//3 IMAGETYPE_PNG 
$realType=exif_imagetype($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]);
if( 1 == $realType || 2 ==$realType || 3 ==$realType){
    //开始检查是否存在木马代码
    $safe=is_safe($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]);
    if(!$safe){
        exit (&#39;图片包含木马,禁止上传!&#39;); 
    }
    if (move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], $uploadfile)) {
        echo "文件上传成功.\n";
    } else {
        echo "上传失败!\n";
    }
}else{
    exit (&#39;只能上传gif、png和jpg的图片&#39;); 
}
function is_safe($fileurl) {
    $handle = fopen($fileurl, &#39;rb&#39;);
    $fileSize = filesize($fileurl);
    fseek($handle, 0);
    if ($fileSize > 512) { // 取头和尾
        $hexCode = bin2hex(fread($handle, 512));
        fseek($handle, $fileSize - 512);
        $hexCode .= bin2hex(fread($handle, 512));
    } else { // 取全部
        $hexCode = bin2hex(fread($handle, $fileSize));
    }
    fclose($handle);
    /* 匹配16进制中的 <% ( ) %> */
    /* 匹配16进制中的 <? ( ) ?> */
    /* 匹配16进制中的 <script | /script> 大小写亦可*/
    //匹配表示有木马
    return !preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode);
}
登录后复制

   


相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板