当前位置: 首页 > 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();}}
}
http://www.lryc.cn/news/475937.html

相关文章:

  • 【MacOS实操】如何基于SSH连接远程linux服务器
  • EXPLAIN 针对性优化 SQL 查询
  • MR30分布式IO:石化行业的智能化革新
  • linux图形化X窗口
  • 练习LabVIEW第三十五题
  • Decision Tree Regressor (决策树) --- 论文实战
  • 三层交换技术,eNSP实验讲解
  • 单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
  • 研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!
  • Java 中 HashMap集合使用
  • #渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问
  • 平台化运营公司如何在创业市场招商
  • 飞书API-获取tenant_access_token
  • (新)docker desktop镜像迁移
  • 单向函数、单向陷门函数、困难问题
  • MYSQL 小猫钓鱼 - 猫王争霸之〈主从设计〉
  • arcgis坐标系问题
  • ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题
  • 【软考】RUP相关考点总结
  • PostgreSQL 删除角色
  • 华为HCIP —— QinQ技术实验配置
  • 全网最简单的GraphRAG讲解,包你懂
  • rust 压缩解压库flate2保姆级教程
  • 秒杀优化(异步秒杀,基于redis-stream实现消息队列)
  • Node.js——fs模块-文件读取
  • 深入理解 ZooKeeper:分布式协调服务的核心与应用
  • 你竟然还不了解 LDAP?
  • 宝塔使用clickhouse踩坑
  • Linux命令学习记录
  • 一般无人机和FPV无人机的区别