`
hongtoushizi
  • 浏览: 374724 次
  • 性别: 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(Active Server Pages)开发中,用户上传图片是一项常见的功能。这个场景通常涉及安全性和用户体验,例如确保图片格式正确,防止恶意文件上传,并限制图片大小以优化服务器资源。以下是对"上传图片asp代码(包括...

    JS判断并预览客户端上传图片

    综上所述,"JS判断并预览客户端上传图片"这一技术涉及到对用户上传图片的格式、大小进行验证,并提供实时预览的功能,以确保上传的图片符合规定,提高用户体验。在实际应用中,还可能需要考虑错误提示、多图上传、...

    多图片上传-判断图片像素-生成缩略图

    用户上传多张图片后,前端先进行像素判断,如果图片尺寸不符合要求,可以提示用户或自动调整。接着,前端或后端生成缩略图并保存。对于大型网站或应用,为了提高效率,还可以采用异步处理,即先将原始图片存储,然后...

    纯javascript实现上传图片前图片预览,判断图片大小

    在本文中,我们将深入探讨如何使用纯JavaScript实现上传图片前的预览功能,并且检查图片的大小,确保兼容性覆盖到IE7至IE10、Firefox以及Chrome等主流浏览器。这个功能对于用户交互体验有着重要的作用,因为它允许...

    单张图片上传压缩

    - 图片上传过程中应考虑安全问题,如防止XSS攻击,可以通过转码、过滤特殊字符等方式处理用户上传的数据。 - 对于敏感内容的图片,可能需要进行隐私保护处理,如添加水印或模糊处理。 综上所述,单张图片上传压缩...

    FraUpload多图片上传.zip

    这款插件不仅支持批量上传,还具备图片预览、可拖动排序等人性化特性,极大地提升了用户在网页上的交互体验。 在多图片上传这一领域,FraUpload插件具有以下核心知识点: 1. **批量上传**:用户可以选择多张图片...

    高度,javascript判断上传图片大小,宽度,高度

    在JavaScript中,对上传图片进行大小、宽度和高度的判断是一项常见的前端操作,尤其是在实现用户在网站上上传图片时需要预览和验证图片格式及尺寸的场景。以下是一些关于如何使用JavaScript进行这些判断的关键知识点...

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

    在处理PHP文件上传功能时,经常会遇到需要判断上传文件是否为图片类型的场景。...以上就是PHP判断文件上传图片格式的详细方法和实例详解,希望对您有所帮助。如遇到相关问题,可以参考本文中的方法进行解决。

    图片上传本地预览插件

    - MIME类型检查:验证用户上传的文件是否为图片,通过检查文件的MIME类型(例如"image/jpeg", "image/png"等)。 - 文件扩展名验证:也可以根据文件的扩展名来判断是否为图片,但这种方法不如MIME类型准确。 4. ...

    android studio写的图片选择上传

    在描述中提到的"一个android上传图片的模块",这通常涉及到以下几个关键步骤: 1. **图片选择**:在Android中,我们可以使用Intent来调用系统的图库应用,让用户选择一张或多张图片。通过设置Intent的ACTION_PICK...

    图片上传-有去重功能

    或者在服务器端建立一个图片指纹库,通过比对新上传图片的指纹(如MD5或SHA1)来判断是否重复。 5. **去除重复**:在实现去重功能时,可能需要在数据库中存储图片的元数据,如文件名、大小、哈希值等,以便快速查找...

    C# 小程序上传图片前后台.rar

    总结来说,"C#小程序上传图片前后台.rar"项目涵盖了微信小程序的用户授权、文件选择、文件上传,以及C#后端的文件接收、验证、保存和响应处理等多个技术环节。理解并掌握这些知识点,能帮助开发者实现一个完整的图片...

    java处理上传后的图片

    在现代Web应用中,用户上传图片的功能十分常见。为了优化用户体验并减轻服务器存储压力,通常会在图片上传后进行一系列处理,如压缩、缩放等。本文将重点介绍如何使用Java语言对上传的图片进行缩放处理。 #### 二、...

    图片上传压缩处理源码

    因此,对上传的图片进行压缩处理变得尤为重要。通过压缩技术可以有效地减小图片文件大小,从而提高网页或应用的加载速度,并减少带宽消耗和服务器存储空间的需求。 ### 图片压缩处理的基本原理 图片压缩处理通常...

    java图片上传源代码

    在Java Web开发中,图片上传是一项常见的功能,用于允许用户上传他们的图片到服务器。这个案例主要涉及Struts2框架,一个流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。Struts2提供了...

    绝对好用的上传文件上传图片vb.net示例

    这个"绝对好用的上传文件上传图片vb.net示例"提供了一个基础的实现,它不仅可以处理图片上传,通过调整还能扩展到其他文件类型的上传。下面将详细讲解其中涉及的关键知识点。 1. 文件上传控件:在ASP.NET中,`...

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

    我们都知道,客户上传图片时,可能会将png的图片后缀名改为jpg,从而绕过后缀名判断。因此,我们需要使用其他方法来判断上传的文件是否为图片类型。 第一个方法是使用ImageIO库来判断图片格式。我们可以使用ImageIO...

    js图片上传并预览图片

    在JavaScript中实现图片上传并预览功能是一项常见的前端任务,主要涉及到HTML5的...以上是实现“js图片上传并预览图片”的主要技术点和步骤,理解并掌握这些知识点,可以构建出稳定且用户体验良好的图片上传预览功能。

    js判断图片真实性(非判断文件后缀)

    总之,通过这种方法,前端开发者可以在用户上传图片时提供额外的安全保障,避免非图片文件的误传,从而提高系统的安全性。然而,这种方法并不完美,因为一些图片格式的二进制头可能会有变体,或者新的图片格式可能...

Global site tag (gtag.js) - Google Analytics