`
hongtoushizi
  • 浏览: 358300 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

    博客分类:
  • php
阅读更多

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

 

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

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php


//允许的图片类型
$imageType = array('jpg','gif','png');
//上传后存放的路径
$uploadfile = './data/' . basename($_FILES['userfile']['name']);
//获取文件的扩展名
$finfo = new SplFileInfo($_FILES['userfile']['name']);
$extName=$finfo->getExtension();

//第一道关卡,简单过滤非法文件。
if(!in_array($extName,$imageType)){
    exit('只能上传gif、png和jpg的图片');
}

//依据文件头信息检查图片的真实类型
//1 IMAGETYPE_GIF
//2 IMAGETYPE_JPEG
//3 IMAGETYPE_PNG

$realType=exif_imagetype($_FILES['userfile']['tmp_name']);
if( 1 == $realType || 2 ==$realType || 3 ==$realType){
    //开始检查是否存在木马代码
    $safe=is_safe($_FILES['userfile']['tmp_name']);
    if(!$safe){
        exit ('图片包含木马,禁止上传!');
    }
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "文件上传成功.\n";
    } else {
        echo "上传失败!\n";
    }

}else{
    exit ('只能上传gif、png和jpg的图片');
}



function is_safe($fileurl) {
    $handle = fopen($fileurl, 'rb');
    $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);
}

转载自: http://blog.sijiaomao.com/?p=187

 

 

分享到:
评论

相关推荐

    vue 检测用户上传图片宽高的方法

    如果用户上传的图片没有上限,可以动态修改这个对象数组。 data: picArray:[ { width:0, height:0 }, { width:0, height:0 }, { width:0, height:0 }, { width:0, height:0 }, { width:0, ...

    上传图片asp代码(包括对图片类型、大小的判断)

    asp代码,给用户上传图片。上传之前有对图片的格式、大小的判断及限制。上传后图片以二进制格式存入数据库中,显示图片也是从数据库中读出

    Java判断上传图片格式的实例代码

    主要介绍了Java判断上传图片格式的实例代码,在文中给大家提到了Java使用文件头的类型判断上传的文件是否为图片类型,需要的朋友可以参考下

    图片上传后实现图片缩放

    很好用的资源,用户上传图片时,省去有很多判断,对图片的处理,用户即使上传不满足条件的图片也会处理,项目开发时做的,但需求不需要缩放,这个就搁浅了

    asp无组件上传类v0.98(无刷新ajax上传,可检查图片木马,支持多文件批量上传,utf-8版)

    建议不要以判断、eval、%&gt;这3个特殊字符串来确定图片木马,因为正常文件中可能也有,而且有些图马文件没有。 如果需要测试图片木马文件可以自己百度制作方法,按照教程做几个图片木马文件然后用本程序上传测试。 ...

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

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

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

    这里我们来解决一个小问题,就是如何判断用户上传文件的文件类型。 举一个应用场面:在我们的Web应用中,比如用户上传头像,要求是png,jpg,gif格式,接收到图片后会根据图片格式类型做不同的头像切割处理,但个别...

    图片上传并按比例缩小

    在ASP.NET中上传图片并生成缩略图的C#源码 &lt;FONT size=4&gt;&lt;FONT size=4&gt;&lt;FONT size=4&gt;using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using ...

    二进制判断数据类型

    通常对用户上传的图片需要保存到数据库中。解决方法一般有两种:一种是将图片保存的路径存储到数据库;另一种是将图片以二进制数据流的形式直接写入数据库字段中。以下为具体方法:  一、保存图片的上传路径到...

    js判断上传文件大小,支持多种浏览器

    js判断上传文件大小,支持多种浏览器,在做项目的时候用到的,一个用户上传一张图片30多M,然后程序就一直出错,在网上好不容易找到一个支持多种浏览器的js判断上传文件大小的方法,和大家分享下……

    爱雪儿无组件上传类 v2.0

    美化了上传进度条 优化了进度条代码,是进度条支持多用户 进度数据文件修改为.JS扩张名,适应更多的服务器环境,并加入了清理工具 增加了创建目录的函数 修改了获取图片尺寸时分辩图片文件类型的判断方法,...

    jsp+servlet+ajax,登录验证码图片上传

    图六 说明:点击添加DVD可以进行添加DVD的操作,其中编号已经自增不允许变更,可以上传DVD的图片。 图七 说明:可以对DVD信息根据名称进行模糊查询,如果查询内容为空,则显示所有DVD信息,可以进行借出,归还,修改...

    java mysql 在线考试提交系统

    布置作业、单选 多选 判断 解答 上传图片。 提交作业、查看成绩。 批阅作业、系统自动批改、老师 手动批改、打分 师生交流、 留言和回复。 角色:分为学生、教师、管理员 登录、注册 用户管理 题目管理 布置作业、...

    图相匹配程序

    可以判断某个小区域是否属于某一张图片,并且能够在大图中将这个小区域标记出来,采用逐个点判断的方法,精确度很高,但是速率相对较慢

    小精豆网络相册V3.0网络图片存储系统源码(高仿淘小宝)

    用户自定义默认上传图片名称模式、水印参数、图片浏览模式等; 用户可随意变更现有套餐,现有套餐变更所付费用=新套餐价格-现有套餐剩余价值; 人性化设计,创建文件夹或修改文件夹名称成功后自动返回父级目录; ...

    ASP.NET+jQuery 批量文件上传控件及示例程序

    这是一个ASP.NET多文件上传用户控件的源代码,另附上了控件的应用实例,加入了jQuery插件,实现了批量无刷新上传,客户端判断文件上传类型,你可以在页面中直接调用,小巧方便。实例只是为了演示,暂时只支持JPG/GIF...

    asp防止上传图片木马原理解析

    首先判断文件大小: if file.filesize&lt;...将文件上传到服务器后,判断用户文件中的危险操作字符: set MyFile = server.CreateObject(Scripting.FileSystemObject) set MyText = MyFile.OpenTextFile(FilePa

    AI-face-search:调用百度AI人脸识别APi,完成用户上传图片并检测的流程

    AI-face-search调用百度AI人脸识别APi,完成用户上传图片并检测的流程使用说明需要在百度开发则平台注册开通AI版块中的人脸识别创建应用,获取AppID、token等信息创建一个用户集,并上传他们的脸部照片代码部分本...

    基于 NSFW Model 色情图片识别鉴黄 后面更新视频检测.zip

    色情图片识别:用户上传图片后,系统会自动调用 NSFW Model 对图片进行识别,判断图片是否含有色情内容。如果含有色情内容,系统会给出相应的提示,并阻止图片的传播。 视频检测:针对网络视频,本项目采用帧提取...

Global site tag (gtag.js) - Google Analytics