当前位置: 首页 > news >正文

用魔数严谨的判别文件类型:杜绝上传风险

在文件处理和管理中,确定文件的类型是一个常见的需求。虽然文件扩展名可以提供一些信息,但并不总是可靠的。魔数(Magic Numbers)是一种更为准确的方法,通过检查文件开头的特定字节序列来识别文件类型。本文将介绍如何在Java中实现使用魔数判断文件类型的功能。

什么是魔数?

魔数是文件格式的标识符,通常位于文件的开头部分。每种文件格式都有其独特的魔数。例如:

  • JPEG 文件以 FF D8 开头。
  • PNG 文件以 89 50 4E 47 开头。
  • PDF 文件以 %PDF 开头。
  • ZIP 文件以 50 4B 开头。

Java实现示例

public enum FileTypeEnum {/*** JPEG*/JPEG("JPEG", "FFD8FF"),/*** PNG*/PNG("PNG", "89504E47"),/*** GIF*/GIF("GIF", "47494638"),/*** TIFF*/TIFF("TIFF", "49492A00"),/*** Windows bitmap*/BMP("BMP", "424D"),/*** CAD*/DWG("DWG", "41433130"),/*** Adobe photoshop*/PSD("PSD", "38425053"),/*** Rich Text Format*/RTF("RTF", "7B5C727466"),/*** XML*/XML("XML", "3C3F786D6C"),/*** HTML*/HTML("HTML", "68746D6C3E"),/*** Outlook Express*/DBX("DBX", "CFAD12FEC5FD746F "),/*** Outlook*/PST("PST", "2142444E"),/*** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db*/OLE2("OLE2", "0xD0CF11E0A1B11AE1"),/*** Microsoft Word/Excel*/XLS_DOC("XLS_DOC", "D0CF11E0"),/*** Microsoft Access*/MDB("MDB", "5374616E64617264204A"),/*** Word Perfect*/WPB("WPB", "FF575043"),/*** Postscript*/EPS_PS("EPS_PS", "252150532D41646F6265"),/*** Adobe Acrobat*/PDF("PDF", "255044462D312E"),/*** Windows Password*/PWL("PWL", "E3828596"),/*** ZIP Archive*/ZIP("ZIP", "504B0304"),/*** ARAR Archive*/RAR("RAR", "52617221"),/*** WAVE*/WAV("WAV", "57415645"),/*** AVI*/AVI("AVI", "41564920"),/*** Real Audio*/RAM("RAM", "2E7261FD"),/*** Real Media*/RM("RM", "2E524D46"),/*** Quicktime*/MOV("MOV", "6D6F6F76"),/*** Windows Media*/ASF("ASF", "3026B2758E66CF11"),/*** MIDI*/MID("MID", "4D546864"),/*** xlsx*/XLSX("XLSX", "504B0304"),/*** xls*/XLS("XLS", "D0CF11E0A1B11AE1");private String key;private String value;FileTypeEnum(String key, String value) {this.key = key;this.value = value;}public String getValue() {return value;}public String getKey() {return key;}
}
import java.io.IOException;
import java.io.InputStream;public class FileUtils {/*** 获取文件头** @param inputStream 输入流* @return 16 进制的文件投信息* @throws IOException io异常*/private static String getFileHeader(InputStream inputStream) throws IOException {byte[] b = new byte[28];inputStream.read(b, 0, 28);return bytes2hex(b);}/*** 将字节数组转换成16进制字符串** @param src 文件字节数组* @return 16进制字符串*/private static String bytes2hex(byte[] src) {StringBuilder stringBuilder = new StringBuilder("");if (src == null || src.length <= 0) {return null;}for (byte b : src) {int v = b & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}/*** 判断指定输入流是否是指定文件格式** @param inputStream  输入流* @param fileTypeEnum 文件格式枚举* @return true 是;false 否* @throws IOException io异常*/public static boolean isFileType(InputStream inputStream, FileTypeEnum fileTypeEnum) throws IOException {if (null == inputStream) {return false;}String fileHeader = getFileHeader(inputStream);return fileHeader.toUpperCase().startsWith(fileTypeEnum.getValue());}public static void main(String[] args) {}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test {public static void main(String[] args) {File file = new File("D:/1.xlsx");try (FileInputStream fileInputStream = new FileInputStream(file)) {if (FileUtils.isFileType(fileInputStream, FileTypeEnum.XLSX) || FileUtils.isFileType(fileInputStream, FileTypeEnum.XLS)) {System.out.println("文件类型匹配");} else {System.out.println("文件类型不匹配");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

相关文章:

用魔数严谨的判别文件类型:杜绝上传风险

在文件处理和管理中&#xff0c;确定文件的类型是一个常见的需求。虽然文件扩展名可以提供一些信息&#xff0c;但并不总是可靠的。魔数&#xff08;Magic Numbers&#xff09;是一种更为准确的方法&#xff0c;通过检查文件开头的特定字节序列来识别文件类型。本文将介绍如何在…...

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器&#xff0c;可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件&#xff0c;则跳过这一步。如果手上有ppk文件&#xff0c;那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式&#xff0c;你需要将 PPK 文…...

EXPLAIN 针对性优化 SQL 查询

在数据库管理和应用中&#xff0c;高效的 SQL 查询是确保系统性能的关键。随着数据量的不断增长和业务需求的日益复杂&#xff0c;优化 SQL 查询变得尤为重要。而 EXPLAIN 命令是一种强大的工具&#xff0c;可以帮助我们深入了解 SQL 查询的执行计划&#xff0c;从而进行有针对…...

MR30分布式IO:石化行业的智能化革新

在浩瀚的工业领域中&#xff0c;石化行业如同一座巨大的化工厂&#xff0c;将自然界的原始资源转化为人们日常生活中不可或缺的各种产品。然而&#xff0c;随着生产规模的扩大和工艺复杂度的提升&#xff0c;石化行业面临着前所未有的挑战&#xff1a;如何在保证生产效率的同时…...

linux图形化X窗口

【linux图形化协议框架】 X、X11系统&#xff1a;X协议&#xff0c;X服务器&#xff0c;窗口管理器&#xff0c;X客户端&#xff08;客户端库Xcb&#xff0c;Xlib库等&#xff09;&#xff0c;输入、绘制 Wayland系统&#xff1a;Wayland 协议&#xff0c;合成器、客户端&#…...

练习LabVIEW第三十五题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十五题&#xff1a; 使用labview模拟一个3-8译码器 开始编写&#xff1a; 用LabVIEW做3-8译码器首先要知道它是个啥…...

Decision Tree Regressor (决策树) --- 论文实战

一、前言 在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址) 这里我们不做前期处理,直接就将数据放入 DecisionTreeRegressor 模型中进行训练了。 二…...

三层交换技术,eNSP实验讲解

三层交换技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、应用场景5、与路由器的区别 二、eNSP仿真实验1、步骤一&#xff1a;创建连接&#xff0c;明确参数。2、步骤二&#xff1a;设置PC1和PC2参数3、步骤三&#xff1a;配置交换机&#xff0c;通过命…...

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路&#xff1a; 合并两个有序链表&#xff1a;首先创建新链表的头节点&#xff08;哨兵位&#xff1a;本质上是占位子&#xff09;&#xff0c;为了减少一些判断情况&#xff0c;简化操作。然后我们…...

研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!

小绿书作为今年最大的红利&#xff0c;很多人已经吃到了螃蟹。看——&#xff1a; 今天我们总结了100个10万爆款&#xff0c;我们发现要在这个平台上脱颖而出&#xff0c;找到属于自己的方法尤为重要。在这里分享一个主题——小绿书的秘诀就是“先抄后超&#xff0c;持续出摊”…...

Java 中 HashMap集合使用

目录 一. HashMap概述 二. HashMap特点 三. HashMap构造方法 四. HashMap的常用方法 五. 使用注意事项 六. 代码示例 一. HashMap概述 HashMap 是 Java 中的一个非常重要的类&#xff0c;它实现了 Map 接口&#xff0c;用于存储键值对&#xff08;key-value pairs&#…...

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

平台化运营公司如何在创业市场招商

在当今商业环境中&#xff0c;平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言&#xff0c;在创业市场招商意义重大。 平台化运营公司具有独特特点&#xff1a;通过搭建开放共享平台连接供需双方&#xff0c;实现资源优化配置与价值创造。比如电子商务平台、社…...

飞书API-获取tenant_access_token

1.在飞书工作台创建应用&#xff0c;跳到开发者后台&#xff0c;选创建企业自建应用 2.设置并发布应用 必须要发布应用才可以开始使用了&#xff01;&#xff01;&#xff01; 3.调用获取token的API 参考链接&#xff1a; 开发文档 - 飞书开放平台https://open.feishu.cn/do…...

(新)docker desktop镜像迁移

背景 docker desktop默认安装在系统c盘&#xff0c;久而久之随着镜像拉取的越多&#xff0c;系统盘占用则越来越大。现有的网络资源关于docker desktop迁移都是旧版本的&#xff0c;即4.30版本之前。在4.30版本及以后&#xff0c;在运行wsl -l -v时只有docker-desktop只有这一项…...

单向函数、单向陷门函数、困难问题

1、单向函数 设函数 yf(x) &#xff0c; 对于给定的x&#xff0c;计算出y很容易&#xff1b;对于给定的y&#xff0c;计算出x很难。 2、单向陷门函数 设函数 yf(x) &#xff0c;且f有陷门&#xff0c; 对于给定的x&#xff0c;计算出y很容易&#xff1b;对于给定的y&#…...

MYSQL 小猫钓鱼 - 猫王争霸之〈主从设计〉

在美丽的森林中&#xff0c;小猫们的钓鱼大赛依旧热闹非凡&#xff0c;而 “猫王争霸” 的竞争也越来越激烈。随着时间的推移&#xff0c;越来越多的动物们开始关注这场有趣的比赛&#xff0c;对鱼表数据的查询请求也急剧增加。 一、请求压力剧增 花猫看着鱼表发愁道&#xf…...

arcgis坐标系问题

2000数据框的工程只能打开2000坐标系的矢量数据和栅格数据&#xff08;影像图&#xff09;&#xff0c;如果打开80的数据则会投影错误&#xff0c;出现较大偏差。 解决方案&#xff1a;80数据框打开80数据&#xff0c;2000数据库打开2000数据。...

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…...

【软考】RUP相关考点总结

RUP&#xff0c;是一个重量级过程&#xff0c;提供一个在线指导&#xff0c;为所有方面提供指导方针。 关于RUP&#xff08;统一软件开发过程&#xff09;的9个核心工作流&#xff0c;如果考试中出现&#xff0c;可能会以以下几种方式进行考察&#xff1a; 定义和描述&#xff…...

PostgreSQL 删除角色

我们在使用 PostgreSQL 数据库的时候&#xff0c;经常会遇到这样的场景&#xff0c;就是某个角色&#xff0c;现在不需要了&#xff0c;我们需要删除。但是在删除的时候又提示你无法删除角色。下面看一下具体的情况。 DROP USER cloud_readonly > ERROR: role "cloud…...

华为HCIP —— QinQ技术实验配置

一、QinQ的概述 1.1QinQ的概念 QinQ&#xff08;802.1Q in 802.1Q&#xff09;技术是一项扩展VLAN空间的技术&#xff0c;通过在原有的802.1Q报文基础上再增加一层802.1Q的Tag来实现。 1.2QinQ封装结构 QinQ封装报文是在无标签的以太网数据帧的源MAC地址字段后面加上两个VL…...

全网最简单的GraphRAG讲解,包你懂

一、什么是 GraphRAG&#xff1f; GraphRAG&#xff08;基于图的检索增强生成&#xff09;是在传统 RAG 方法的基础上&#xff0c;引入了图数据结构的新型方法。它利用大语言模型的强大自然语言理解能力&#xff0c;从非结构化文本中抽取实体和关系&#xff0c;构建知识图谱&a…...

rust 压缩解压库flate2保姆级教程

前言 flate2 是 Rust 中用于处理 gzip 和其他压缩格式的库。以下是 flate2 的主要 API 和用法说明。 依赖添加 在你的 Cargo.toml 中添加依赖&#xff1a; [dependencies] flate2 "1.0.34"主要模块 flate2::write&#xff1a;用于压缩数据的写入器。flate2::re…...

秒杀优化(异步秒杀,基于redis-stream实现消息队列)

目录 秒杀优化一&#xff1a;异步秒杀1&#xff1a;思路2&#xff1a;实现 二&#xff1a;redis实现消息队列1&#xff1a;什么是消息队列2&#xff1a;基于list结构实现消息队列3&#xff1a;基于pubsub实现消息队列4&#xff1a;基于stream实现消息队列5&#xff1a;stream的…...

Node.js——fs模块-文件读取

1、文件读取&#xff1a;通过程序从文件中去除其中的数据 2、方法 方法 说明 readFile 异步读取 readFileSync 同步读取 createReadStrean 流式读取 3、readFile 异步读取 语法&#xff1a; 本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学习&#xff0c;下一…...

深入理解 ZooKeeper:分布式协调服务的核心与应用

一、引言 随着互联网技术的飞速发展&#xff0c;分布式系统的规模和复杂性不断增加。在分布式环境中&#xff0c;各个节点之间需要进行高效的协调和通信&#xff0c;以确保系统的正常运行。ZooKeeper 正是为了解决分布式系统中的协调问题而诞生的一款开源软件。它提供了一种简单…...

你竟然还不了解 LDAP?

目录 什么是 LDAP LDAP 的工作原理 LDAP 的数据模型 LDAP 操作 LDAP 的使用场景 常见的 LDAP 服务器 小结 什么是 LDAP LDAP&#xff08;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议&#xff09;是用于访问和管理目录服务的一种开放协议&…...

宝塔使用clickhouse踩坑

前言 最近有个物联网项目&#xff0c;需要存储物联网终端发送过来的信息&#xff08;类似log日志&#xff0c;但又要存储在数据库里&#xff0c;方便后期聚合统计&#xff09;&#xff0c;本来想写文件的奈何客户要求聚合统计&#xff0c;所以只能用数据库才能达到更高的计算效…...

Linux命令学习记录

ls 查看文件资源&#xff0c;ls [选项] [路径] ls ls [单个选项] ls [组合选项]&#xff0c;选项的组合与顺序无关 ls --help 查看更多命令参数 clear 清屏 cd 更换工作目录&#xff0c;cd [路径] cd [特殊路径符] . 表示当前目录 .. …...