`

文件类型检查工具:jmimemagic源码解析

阅读更多

在开发中,经常会有上传文件的需求,为了安全起见,防止上传恶意文件,需要对文件类型进行检查。网上一般有两种方式:

1、对文件扩展名进行检查,符合指定扩展名的文件才可以上传成功

2、对文件头进行检查,文件头的魔数符合预期(每种文件的魔数都是已知的),才可以上传成功

第1种方式有明显的缺陷,用户可以通过修改扩展名来通过检查,

第2种方式可以满足绝大多数场景,但是也有缺点,它不去判断文件扩展名

 

jmimemagic就是利用文件头中的魔数来判断文件类型的开源工具。

其地址见:https://github.com/arimus/jmimemagic.git

 

其获取文件类型流程如下:

 


说明:

1、整个过程中,涉及几个重要的类:

   a、Magic:jmimeMagic工具对外交互接口类,类中方法都是static方法。主要的方法有:getMagicMatch(File, boolean)、getMagicMatch(File, boolean, boolean)

   b、MagicParser:magic.xml文件解析类,将magic.xml中的数据解析为内部对象,底层解析使用到SAXParse。

   c、MagicMatch:magic.xml文件中match标签对应的对象

   d、MagicMatcher:将文件和MagicMatch关联起来的工具类

 

2、左侧虚线框主要加载解析magic.xml文件,解析的结果就是MagicMatcher列表和hintMap列表

   a、 magic.xml的代码片段如下:

     <match>

<mimetype></mimetype>

<extension></extension>

<description>b, 32 kBits</description>

<property name="bitrate" value="32"/>

<test type="byte" offset="2" length="" bitmask="0xf0" comparator="=">0x10</test>

</match>

    每一个match标签对解析后得到一个MagicMatch对象,一个MagicMatch对象存放在MagicMatcher对象中。

  b、类MagicMacth的属性如下:

       private String mimeType = null;

       private String extension = null;

       private String description = null;

       private ByteBuffer test = null;

       private int offset = 0;

       private int length = 0;

 

       // possible types:

       //     byte, short, long, string, date, beshort, belong, bedate, leshort,

       //     lelong, ledate, regex

       private String type = "";

       private long bitmask = 0xFFFFFFFFL;

       private char comparator = '\0';

       private List<MagicMatch> subMatches = new ArrayList<MagicMatch>(0);

       private Map<String,String> properties;

 

3、右侧的虚线框主要是根据文件获取MagicMatch

    a、如果传入方法Magic#getMagicMatch的参数extHints=true,那么优先使用文件扩展名去获取MagicMatch,只有根据文件扩展名获取不到MagicMatch的情况下,才会遍历整个matchers去获取对应的MagicMatch。因此,一般extHints的入参值为true。

   b、特殊情况下,获取不到MagicMatch,就会抛出异常。

 

4、测试代码:

public class TestMagic {

 

    public static void main(String[] args) {

        MagicMatch magicMatch;

        try {

            magicMatch = Magic.getMagicMatch(new File("/home/yangjianzhou/document/123456.png"), false);

        } catch (Exception exp) {

            exp.printStackTrace();

            return;

        }

        String mimeType = magicMatch.getMimeType();

        System.out.println("file mime type is : " + mimeType);

    }

 

}

 

总结:

jmimeMagic是一个很好的获取文件mimeType的工具类,对于大多数文件来说,都可以判断出其文件mimeType,如果不能判断,则可以对magic.xml进行扩展使其满足要求。但是,如果在文件尾部人为写入一些内容,可以躲过该工具的检测。

 

在本文开始提到过,可以使用扩展名或者文件头来判断文件类型,但是各有优劣,我们可以联合两种方式来判断:首先判断扩展名,在扩展名满足要求的情况下,再检测文件头,如果文件头检测通过,即使文件中被写入恶意代码,这些恶意代码也不会执行。

  • 大小: 150.6 KB
分享到:
评论

相关推荐

    Java获取MIME开源类库jmimemagic-0.1.2.jar

    在Http请求中,有时需要知道Content-Type类型,尤其是上传文件时,更为重要,虽然有些办法可以解决,但都不太准确或者繁琐.jMimeMagic是一个用来检测文件或者数据流的 MIME 类型的 Java 类库。 最新版本是V 0.1.2。...

    MagicMatch.7z

    导入jmimemagic.jar,import net.sf.jmimemagic.Magic; import net.sf.jmimemagic.MagicMatch;返回文件类型

    Java Mime Magic Library-开源

    jMimeMagic 是一个 Java 库,用于确定文件或流的 MIME 类型。 来源:https://github.com/arimus/jmimemagic

    Magic MagicMatch

    jmimemagic-0.1.0.jar 图片类型自动识别

    node-v6.11.1-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    ArduinoESP32板卡支持包

    ArduinoESP32板卡支持包

    Inno-Tasks-Test.zip

    无需在自定义页面中使用复杂的设置,而是使用Inno设置[Task]使安装更简单。

    node-v18.14.2-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.15.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于SSM+JSP的高校实验室信息化综合管理平台毕业设计(源码+录像+说明).rar

    基于SSM+JSP的高校实验室信息化综合管理平台毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:417】 https://pan.quark.cn/s/b3a97032fae7

    MOSFET损耗MOSFET计算损耗分析与工程近似计算等资料合集(10个).zip

    MOSFET损耗MOSFET计算损耗分析与工程近似计算等资料合集(10个): (MCD)MOSFET开关损耗的计算.pdf (核心)BoostPFC电路中开关器件的损耗分析与计算(1).pdf AN-6005.pdf AN-6005_Switching_Loss_Calculation.xls dvdt引发的MOSFET误导通分析.pdf MOSFET损耗计算.pdf MOSFET损耗计算.zip MOSFET损耗详细计算过程.pdf MOSFET的损耗分析与工程近似计算.pdf 《MOSFET损耗计算》操作指导书.pdf 大功率MOSFET的功耗计算.docx 张兴柱之MOSFET分析.pdf 理解功率M0SFET的开关损耗1.pdf

    node-v7.0.0-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.11.1-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    10 采购员绩效考核表-EPES19-SC-CG-026-2023.xlsx

    10 采购员绩效考核表-EPES19-SC-CG-026-2023.xlsx

    SSM+JSP项目-职工档案管理系统的Java毕业设计(源码+演示视频+说明).rar

    SSM+JSP项目-职工档案管理系统的Java毕业设计(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:442】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 本系统主要的功能需求包括用户信息管理、工作经历档案管理、年度考核档案管理等模块

    node-v6.10.1-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    kafka自定义partition分发策略代码实例

    kafka版本:kafka_2.11-0.9.0.1 kafka jar包版本:0.9.0.1 kafka集群:192.168.1.101,192.168.1.102,192.168.1.103 partition分发策略主要是自定义Partitioner的实现类,通过根据key和分区数量来实现

    Java毕业设计-基于SSM框架的高校勤工助学系统(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的高校勤工助学系统(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:489】 https://pan.quark.cn/s/b3a97032fae7

    node-v6.17.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v18.11.0-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics