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

java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件

  1. 四重验证机制

    • 文件扩展名检查(.xlsx/.xls)
    • MIME类型检查
    • 文件魔数验证(真实文件类型)
    • 可执行文件特征检测
  2. 防御措施

    • 使用try-with-resources确保流关闭
    • 限制文件大小防止DoS攻击
    • 使用Apache POI的FileMagic进行专业验证
  3. 生产环境建议

    Yaml

    # application.yml配置 spring: servlet: multipart: max-file-size: 10MB max-request-size: 10MB

完整代码: 

import org.apache.poi.poifs.filesystem.FileMagic;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;// 文件上传限制-只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件
public class ExcelFileValidator {// 允许的Excel文件MIME类型private static final String[] ALLOWED_MIME_TYPES = {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xlsx"application/vnd.ms-excel" // .xls};// 最大文件大小(10MB)private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;/*** 验证Excel文件安全性** @param file 上传的文件* @throws IOException              文件读取异常* @throws IllegalArgumentException 文件非法时抛出*/public static void validateExcelFile(MultipartFile file) throws IOException, IllegalArgumentException {// 基础检查if (file == null || file.isEmpty()) {throw new IllegalArgumentException("请选择要上传的文件");}// 检查文件大小if (file.getSize() > MAX_FILE_SIZE) {throw new IllegalArgumentException("Excel文件大小不能超过10MB");}// 检查文件扩展名String originalFilename = file.getOriginalFilename();if (originalFilename == null ||(!originalFilename.toLowerCase().endsWith(".xlsx") &&!originalFilename.toLowerCase().endsWith(".xls"))) {throw new IllegalArgumentException("仅支持.xlsx或.xls格式的Excel文件");}// 检查MIME类型String contentType = file.getContentType();if (contentType == null || !Arrays.asList(ALLOWED_MIME_TYPES).contains(contentType.toLowerCase())) {throw new IllegalArgumentException("非法的Excel文件类型");}// 使用POI检查文件魔数(真实文件类型)try (InputStream inputStream = file.getInputStream()) {FileMagic fileMagic = FileMagic.valueOf(inputStream);if (fileMagic != FileMagic.OLE2 && fileMagic != FileMagic.OOXML) {throw new IllegalArgumentException("非法的Excel文件格式");}// 基础恶意内容检查checkForExecutableContent(inputStream);}}/*** 检查是否包含可执行文件特征*/private static void checkForExecutableContent(InputStream is) throws IOException {byte[] buffer = new byte[1024];is.read(buffer);// PE文件头检查(Windows可执行文件)if (buffer.length > 60 && buffer[0] == 0x4D && buffer[1] == 0x5A) {throw new IllegalArgumentException("检测到潜在有害文件内容");}// ELF文件头检查(Linux可执行文件)if (buffer.length > 4 && buffer[0] == 0x7F && buffer[1] == 0x45 &&buffer[2] == 0x4C && buffer[3] == 0x46) {throw new IllegalArgumentException("检测到潜在有害文件内容");}}
}

http://www.lqws.cn/news/106381.html

相关文章:

  • Python+requests+pytest+allure自动化测试框架
  • 【知识点】第4章:程序控制结构
  • 互联网大厂Java求职面试:AI大模型与云原生技术的深度融合
  • js-day7
  • Blinko智能笔记系统实现跨平台同步与隐私保护的完整技术方案解析
  • Linux-GCC、makefile、GDB
  • 【软考】计算机系统构成及硬件基础知识
  • docker中组合这几个命令来排查 import 模块失败 的问题
  • Nginx实战
  • 各个主要目录的功能 / Linux 常见指令
  • 词语翻译的三步法与背后的语言学思维
  • 技巧小结:外部总线访问FPGA寄存器
  • 【25.06】fabric进行caliper测试加环境部署
  • 嵌入式系统:从技术原理到未来趋势(驱动程序篇)
  • 预览pdf(url格式和blob格式)
  • Python Day42
  • xmake的简易学习
  • 一、无参数的函数调用- RSP,EAX寄存器,全局变量,INT类型和MOV,INC,SHL指令
  • Python中os模块详解
  • Spring Boot 自动配置原理:从入门到精通
  • webstrom中git插件勾选提交部分文件时却出现提交全部问题怎么解决
  • UGUI Text/TextMeshPro字体组件
  • Activity
  • 6.3本日总结
  • agent mode 代理模式,整体要求,系统要求, 系统指令
  • ABP-Book Store Application中文讲解 - Part 7: Authors: Database Integration
  • 『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)
  • WPS word 已有多级列表序号
  • 免费批量文件重命名软件
  • AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?