图片上传安全性问题,根据ContentType (MIME) 判断其实不准确、不安全

图片上传常用的类型判断方法有这么几种---截取扩展名、获取文件ContentType (MIME) 、读取byte来判断(这个什么叫法来着?)。前两种都有安全问题。容易被上传不安全的文件,如木马什么的。第1种截取文件扩展名来判断的方法很明显不安 全,第2种ContentType MIME可以伪造,所以用ContentType来判断其实也不安全。建议采用第3种。

C#演示:

1.截取扩展名来做判断,不可取。

if (Request.Files.Count > 0)
{
    //这里只测试上传第一张图片file[0]
    HttpPostedFile file0 = Request.Files[0];
    string ext = file0.FileName.Substring(file0.FileName.LastIndexOf(‘.‘) + 1);//文件扩展名
    string[] fileTypeStr = { "jpg", "gif", "bmp", "png" };
    if (fileTypeStr.Contains(ext))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));//保存文件
    }
    else
    {
        Response.Write("图片格式不正确" + ext);
    }
}

2.判断ContentType (MIME) ,比第1种方案安全。但其实ContentType是可伪造的,所以也不够安全。

if (Request.Files.Count > 0)
{
//这里只测试上传第一张图片file[0]
    HttpPostedFile file0 = Request.Files[0];
    string contentType = file0.ContentType;//文件类型
string[] fileTypeStr = { "image/gif","image/x-png","image/pjpeg","image/jpeg","image/bmp"};
    if (fileTypeStr.Contains(contentType))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));
    }
    else
    {
        Response.Write("图片格式不正确" + contentType);
    }
}

3.通过byte获取文件类型,来做判断。

if (Request.Files.Count > 0)
{
//这里只测试上传第一张图片file[0]
    HttpPostedFile file0 = Request.Files[0];

    //转换成byte,读取图片MIME类型
    Stream stream;
    //int contentLength = file0.ContentLength; //文件长度
    byte[] fileByte = new byte[2];//contentLength,这里我们只读取文件长度的前两位用于判断就好了,这样速度比较快,剩下的也用不到。
    stream = file0.InputStream;
    stream.Read(fileByte, 0, 2);//contentLength,还是取前两位
    stream.Close();

    string fileFlag = "";
    if (fileByte != null && fileByte.Length > 0)//图片数据是否为空
    {
        fileFlag = fileByte[0].ToString() + fileByte[1].ToString();
    }
    string[] fileTypeStr = { "255216", "7173", "6677", "13780" };//对应的图片格式jpg,gif,bmp,png
    if (fileTypeStr.Contains(fileFlag))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));
    }
    else
    {
        Response.Write("图片格式不正确:" + fileFlag);
    }
}
时间: 2024-10-12 13:03:09

图片上传安全性问题,根据ContentType (MIME) 判断其实不准确、不安全的相关文章

百度ueditor的图片上传,前后端交互使用

百度ueditor的使用 一个文本编辑器,看了网上很多文档写的很乱,这里拾人牙慧,整理下怎么使用. 这个东西如果不涉及到图片附件上传,其实很简单,就是几个前端文件,直接引用,然后配置下ueditor.config.js即可.这里就不多说. 至于图片上传,ueditor 设计的时候是考虑和后端交互的,所以会看到可以下载什么php,java版本,还有很多网上会说道有什么后端配置文件,改那改这的,但是实际上后端存储业务是按照公司实际来的,实践起来并不顺利. 本文重点讲述的只用前端文件和ueditor.

php图片上传检测是否为真实图片格式

PHP 图片上传,如果不做任何判断的话,随便一个文件如 rar,zip,php,java等文件改个文件名,改个后缀就能以图片形式上传的服务器,往往会造成极大的危害! 工具/原料 PHP apache / nginx / iis phpstorm / netbeans / notepad++ / editplus 方法/步骤 1 第一种方法:如果是只是单纯判断是否是图片格式的话,我使用  getimagesize 方法function checkIsImage($filename){    $al

图片上传根据stream生成image

对于图片上传代码的整合 因为需要判断上传的图片的宽高是否符合尺寸,所以在最初拿到inputstream的时候,就直接获取image格式的图片 本来是想在下面的checkFile中获取的,不过直接使用System.Drawing.Image.FromStream(request.PostedFile.InputStream);的时候报错了,错误意思是说参数为空,应该是由于上面获取byte[]file的时候,关闭了stream,导致request.PostFile.InputStream也没有了,所

[原创]超强C#图片上传,加水印,自动生成缩略图源代码

<%@ Page Language=“C#“ AutoEventWireup=“true“ %> <%@ Import Namespace=“System“ %> <%@ Import Namespace=“System.IO“ %> <%@ Import Namespace=“System.Net“ %> <%@ Import NameSpace=“System.Web“ %> <%@ Import NameSpace=“Legalsof

Jersey后端服务接收ajax前端的图片上传

近期的项目里需要在前端上传图片后端接收处理.前端JSP页面使用Ajax上传图片后端使用Jersey框架提供restful接口接收处理图片. 一.前端的处理 jsp页面中图片上传没有使用form表单而是直接使用file类型的input控件 <input type="file" name="file" class="inpTxtA" value="" id="appLogo"/> <input

用jsp实现简单的图片上传功能(multipart/form-data形式的表单)

2008-10-11 22:07 用jsp实现简单的图片上传功能 1 先做一个页面,选择上传的图片<body>   <form action="uploadServlet" enctype="multipart/form-data" method="POST" >           selectimage: <input type="file" name="myfile"/&

.Net MVC 图片上传

该案例是mvc下的demo,支持单张图片上传. 1 public ActionResult Upload() 2 { 3 string imgurl = ""; 4 foreach (string key in Request.Files) 5 { 6 //这里只测试上传第一张图片file[0] 7 HttpPostedFileBase file0 = Request.Files[key]; 8 9 //转换成byte,读取图片MIME类型 10 Stream stream; 11 i

html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题

先上效果 上传图片后(设置了最多上传3张图片,三张后上传按钮消失) 点击图片放大,可以使用删除和旋转按钮 (旋转功能主要是因为ios手机拍照后上传会有写图片被自动旋转,通过旋转功能可以调正) html页面 需要引入weui.min.css 不然没法渲染样式, 将下面的代码放在需要上传文件的地方就行了,如果不需要图片旋转功能, 可以直接删掉那个div, 改不改js无影响 addPhoto.html <!--图片缩略图--> <div class="weui-cells weui-

Jmeter 5.1实现图片上传接口测试

背景: 项目过程中需要抓取接口进行图片上传的接口测试,所有上传功能大同小异,无非就是参数内容不同,此处记录一下,为其他上传做一些参考 1.通过fiddler抓取到的参数如下: Content-Disposition: form-data; name="file"; filename="9.gif" Content-Type: image/gif 如图: 2.jmeter根据抓取数据如何配置 此处注意:name="file",http请求中para