当前位置: 首页 > 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("检测到潜在有害文件内容");}}
}

相关文章:

  • 013旅游网站设计技术详解:打造一站式旅游服务平台
  • 【设计模式-4.7】行为型——备忘录模式
  • EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案
  • 深入理解 JSX:React 的核心语法
  • electron下载文件
  • RequestRateLimiterGatewayFilterFactory
  • 使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查软件高CPU占用问题
  • MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)
  • Kafka 和Redis 在系统架构中的位置
  • grpc的二进制序列化与http的文本协议对比
  • 68道Hbase高频题整理(附答案背诵版)
  • vue+cesium示例:地形开挖(附源码下载)
  • React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
  • 国标GB28181设备管理软件EasyGBS视频平台筑牢文物保护安全防线创新方案
  • VScode自动添加指定内容
  • Visual Studio Code
  • 使用Composer创建公共类库
  • T/CCSA 663-2025《医疗科研云平台技术要求》标准解读与深度分析
  • SuperMap GIS基础产品FAQ集锦(20250603)
  • 深入剖析物联网边缘计算技术:架构、应用与挑战
  • 做企业网站排名/网络推广怎么做好
  • 哪个做app的网站好/怎样推广自己的商城
  • 用dedecms 做门户网站/经典软文案例100例
  • 如何在网站做引流/临沂头条新闻今日头条
  • 住房和城乡建设部贰级建造师网站/网站设计公司有哪些
  • 网站收录低的原因/推广普通话的意义50字