`

MIME类型-服务端验证上传文件的类型的讨论

阅读更多

      MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

      web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

      Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。

 

      最近在做用表单上传文件,想在服务端验证上传文件的类型,只允许上传GIF,JPG,ZIP, 我们有两种方法, 第一:检查文件的扩展名, 第二:检查文件的MIME类型 。

     检查文件的扩展名的方法,很简单快捷, 但是  a.jsp 改名为 a.jpg能可以绕过检查上传了。

     检查文件的MIME类型的方法,在IE7与Firefox下有一点区别(见下表), 有不同浏览器上传表现不一致。Firefox下ZIP与EXE文件的MIME类型同为application/octet-stream。

 

     或许可以,先检查扩展名, 再检查MIME,不合格的文件不让上传。

     这里也只是讨论,实际情况并不乐观。

 

表中例出的是在服务器端(tomcat5.5)接收不同浏览器上传的文件时,取得的MIME类型

 

用IE7上传 用Firefox3.0上传
GIF

image/gif

image/gif

JPG

image/pjpeg

image/jpeg

ZIP application/x-compressed application/octet-stream
JSP

text/html

text/html

EXE application/octet-stream application/octet-stream

 

 

 

常见MIME类型例表:

 

 

序号

内容类型

文件扩展名

描述

1

application/msword

doc

Microsoft Word

2

application/octet-stream bin

dms lha lzh exe class

可执行程序

3

application/pdf

pdf

Adobe Acrobat

4

application/postscript

ai eps ps

PostScript

5

appication/powerpoint

ppt

Microsoft Powerpoint

6

appication/rtf

rtf

rtf 格式

7

appication/x-compress

z

unix 压缩文件

8

application/x-gzip

gz

gzip

9

application/x-gtar

gtar

tar 文档 (gnu 格式 )

10

application/x-shockwave-flash

swf

MacroMedia Flash

11

application/x-tar

tar

tar(4.3BSD)

12

application/zip

zip

winzip

13

audio/basic

au snd

sun/next 声音文件

14

audio/mpeg

mpeg mp2

Mpeg 声音文件

15

audio/x-aiff

mid midi rmf

Midi 格式

16

audio/x-pn-realaudio

ram ra

Real Audio 声音

17

audio/x-pn-realaudio-plugin

rpm

Real Audio 插件

18

audio/x-wav

wav

Microsoft Windows 声音

19

image/cgm

cgm

计算机图形元文件

20

image/gif

gif

COMPUSERVE GIF 图像

21

image/jpeg

jpeg jpg jpe

JPEG 图像

22

image/png

png

PNG 图像

 

 

分享到:
评论
10 楼 myy 2009-01-10  
tiyi 写道
确实是不稳定。

UTF-8的XML文件(也就是文本文件)
Content-Disposition: form-data; name="file"; filename="C:\wxl.zip"
Content-Type: application/octet-stream


RAR文件
Content-Disposition: form-data; name="file"; filename="C:\AKM-084.txt"
Content-Type: text/plain

不是“不稳定”,是根本没有“绝对准确”的办法,就连那些Mime也是约定俗成的。

IE的做法,基本上主要是靠后缀,但他也会根据读取的文件头部内容“猜一下”真正的Mime,因此对于简单的 txt,应用广泛的jpg,gif,或自家的 office 文件什么的就比较准确了。
9 楼 tiyi 2009-01-09  
确实是不稳定。

UTF-8的XML文件(也就是文本文件)
Content-Disposition: form-data; name="file"; filename="C:\wxl.zip"
Content-Type: application/octet-stream


RAR文件
Content-Disposition: form-data; name="file"; filename="C:\AKM-084.txt"
Content-Type: text/plain
8 楼 myy 2009-01-09  
tiyi 写道
经过求证,浏览器有读取文件内容。不受扩展名欺骗。

Content-Disposition: form-data; name="file"; filename="c:\a.gif"
Content-Type: text/plain

ddd


这个也不靠谱的,你可以多试几种文件类型看看。
7 楼 czx566 2009-01-09  
哦,看样子我又想当然了~
6 楼 tiyi 2009-01-09  
经过求证,浏览器有读取文件内容。不受扩展名欺骗。

Content-Disposition: form-data; name="file"; filename="c:\a.gif"
Content-Type: text/plain

ddd
5 楼 tiyi 2009-01-09  
elf8848 写道
引用
疑惑。
我如果把一个a.jsp文件改名为a.jpg上传,mime是text/html还是image/gif?难道浏览器会判断该文件的真正类型?


不是浏览器会判断该文件的真正类型, 而是上传后,在服务端判断.


yiyu说的情况是:你所取得的mime是浏览器提供的,包含在request。也就是这个数据源来自客户端的声明。而客户端是“按照文件扩展名来确定mime”,因此容易欺骗。

因此你说的 上传后 在服务器端 判断 ,除非你真的开了个 java.io.File 去读文件头,否则mime type也不是可信任的来源。

引号中内容我未求证。
4 楼 elf8848 2009-01-09  
引用
疑惑。
我如果把一个a.jsp文件改名为a.jpg上传,mime是text/html还是image/gif?难道浏览器会判断该文件的真正类型?


不是浏览器会判断该文件的真正类型, 而是上传后,在服务端判断.
3 楼 czx566 2009-01-07  
yiyu 写道
疑惑。
我如果把一个a.jsp文件改名为a.jpg上传,mime是text/html还是image/gif?难道浏览器会判断该文件的真正类型?


虽然没试过,但应该不会~ 浏览器应该没那么强大~
2 楼 yiyu 2009-01-07  
疑惑。
我如果把一个a.jsp文件改名为a.jpg上传,mime是text/html还是image/gif?难道浏览器会判断该文件的真正类型?
1 楼 llp20_2000 2009-01-07  
此文对我颇有帮助,收藏了仔细看.

相关推荐

    第二节 文件上传-绕过MIME-Type验证-01

    因此,Web应用需要对上传文件的MIME-Type进行验证,以确保上传的文件类型安全。 在 PHP 中,可以使用 $_FILE['upload_file']['type'] 获取上传文件的MIME-Type类型。上传文件的MIME-Type类型可以在表单中定义,例如...

    MIME-type MIME-type MIME-type MIME-type

    根据提供的文件信息,我们可以深入探讨MIME类型(Multipurpose Internet Mail Extensions)的相关知识点。MIME类型主要用于描述网络文件的格式,通常在网络传输中用于告诉接收方如何解释数据。以下是对标题、描述及...

    httpmime-4.5.13-API文档-中英对照版.zip

    赠送Maven依赖信息文件:httpmime-4.5.13.pom; 包含翻译后的API文档:httpmime-4.5.13-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5.13; 标签:apache、...

    常见的MIME类型

    压缩文件类MIME类型 - **application/x-gzip**:GZIP是一种文件压缩格式,常用于网页资源的压缩传输,减少网络带宽使用。 - **application/x-tar**:TAR是用于打包多个文件和目录的归档格式,通常与GZIP或BZIP2...

    httpmime-4.5.2-API文档-中英对照版.zip

    赠送Maven依赖信息文件:httpmime-4.5.2.pom; 包含翻译后的API文档:httpmime-4.5.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5.2; 标签:apache、...

    MIME类型的自定义

    3. **客户端和服务端配置**:在服务器端配置正确的MIME类型,同时确保客户端能够正确处理这些类型的数据。 #### 3. 自定义MIME类型的注意事项 - **兼容性**:确保自定义的MIME类型在不同的浏览器和操作系统中都能...

    web.xml中的mime-type标签作用与使用

    通过这些映射,服务器能够根据不同的文件类型发送相应的MIME-Type头,从而确保客户端正确地解析和处理这些文件。 #### 总结 `web.xml`中的`mime-mapping`元素是Java Web应用中非常关键的一部分,它负责定义文件...

    MIME类型,mime-types

    MIME(Multipurpose Internet Mail Extensions)类型是一种标准,用于定义在网络上传输的数据类型。这个标准在互联网上广泛使用,不仅限于电子邮件,还涉及到HTTP协议、文件上传、Web应用程序等多个领域。MIME类型是...

    mime-dir-j-vcard4j

    《Java解析vCard:深入理解mime-dir-j-vcard4j》 在信息技术领域,数据交换是常见的需求之一,尤其在个人联系信息管理方面。vCard便是一种标准格式,用于存储和共享电子名片。本文将围绕Java解析vCard的库——mime-...

    IIS设置MIME类型

    在IIS(Internet Information Services)服务器上正确配置MIME类型对于确保用户能够正常访问和下载各种类型的文件至关重要。例如,如果站点上的视频无法播放或特定文件类型无法被正确识别,那么可能就是由于MIME类型...

    mime类型大全-网页制作

    - **多用途**:除了网页,MIME类型也用于电子邮件、文件上传下载等场景,确保数据的正确传递和处理。 **3. MIME类型分类** 常见的MIME类型有: - **文本类型**:如 "text/plain"(纯文本)、"text/html"(HTML)、...

    httpmime-4.5.13-API文档-中文版.zip

    赠送Maven依赖信息文件:httpmime-4.5.13.pom; 包含翻译后的API文档:httpmime-4.5.13-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5.13; 标签:apache、httpcomponents...

    httpmime-4.5-API文档-中文版.zip

    赠送Maven依赖信息文件:httpmime-4.5.pom; 包含翻译后的API文档:httpmime-4.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5; 标签:apache、httpcomponents、...

    httpmime-4.5.2-API文档-中文版.zip

    赠送Maven依赖信息文件:httpmime-4.5.2.pom; 包含翻译后的API文档:httpmime-4.5.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5.2; 标签:apache、httpcomponents、...

    最全的文件扩展名-MIME类型对照表(MIME类型大全).txt

    标题与描述均指向了一个主题——“最全的文件扩展名-MIME类型对照表”,这实际上是一份详尽的文档,旨在列举各种文件扩展名及其对应的MIME类型。MIME(Multipurpose Internet Mail Extensions)类型是一种标准,用于...

    httpmime-4.5.12-API文档-中英对照版.zip

    赠送Maven依赖信息文件:httpmime-4.5.12.pom; 包含翻译后的API文档:httpmime-4.5.12-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5.12; 标签:apache、...

    mime邮件-mime邮件头介绍

    MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,最初设计用于增强电子邮件的处理能力,使其能够包含非ASCII字符以及各种媒体类型,如图像、音频、视频等。随着互联网的发展,MIME的应用范围已经...

    mime-types下载

    总的来说,`mime-types`是Ruby开发中处理MIME类型不可或缺的工具,尤其在处理HTTP请求、响应、上传文件等内容时,能确保数据的正确传输和处理。了解和熟练使用这个库,有助于提升Web应用的安全性和功能性。

    httpmime-4.5-API文档-中英对照版.zip

    赠送Maven依赖信息文件:httpmime-4.5.pom; 包含翻译后的API文档:httpmime-4.5-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.httpcomponents:httpmime:4.5; 标签:apache、...

    apache-mime4j-0.6.jar&httpmime-4.0.1.jar

    Apache MIME4J与HTTPMIME是两个在Android开发中用于文件上传至服务器的重要库,尤其在处理MIME类型数据时非常关键。这两个Java库分别提供了不同的功能,让我们逐一深入探讨。 首先,Apache MIME4J(apache-mime4j-...

Global site tag (gtag.js) - Google Analytics