XSS 跨站脚本攻击预防(文件上传)

XSS 跨站脚本攻击预防(文件上传)

注意:可以根据需求自定义,改造为拦截器、或者 AOP 等方式实现

import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;/*** 文件上传-文件信息校验工具类* 作用:防止 xss 跨站脚本攻击*/
@Slf4j
public class FileUploadCheckUtils {/*** spring.servlet.multipart的bean对象*/private static final MultipartProperties multipartProperties = SpringUtil.getBean(MultipartProperties.class);/*** 以下变量参数可以自行补充*/// 文件类型常量public static final String JPEG = "jpeg";public static final String JPG = "jpg";public static final String PNG = "png";public static final String GIF = "gif";public static final String PDF = "pdf";public static final String ZIP = "zip";public static final String RAR = "rar";public static final String DOC = "doc";public static final String DOCX = "docx";public static final String XLS = "xls";public static final String XLSX = "xlsx";public static final String PPT = "ppt";public static final String PPTX = "pptx";// 魔数常量public static final String JPEG_MAGIC = "FFD8FF";public static final String JPG_MAGIC = "FFD8FF";public static final String PNG_MAGIC = "89504E47";public static final String GIF_MAGIC = "47494638";public static final String PDF_MAGIC = "25504446";public static final String ZIP_MAGIC = "504B0304";public static final String RAR_MAGIC = "52617221";public static final String DOC_MAGIC = "D0CF11E0";public static final String DOCX_MAGIC = "504B0304";public static final String XLS_MAGIC = "D0CF11E0";public static final String XLSX_MAGIC = "504B0304";public static final String PPT_MAGIC = "D0CF11E0";public static final String PPTX_MAGIC = "504B0304";// 允许的文件类型// key-value : 文件类型-文件魔数private static final Map<String, String> FILE_TYPE_MAGIC_NUMBERS = new HashMap<>();static {FILE_TYPE_MAGIC_NUMBERS.put(JPEG, JPEG_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(JPG, JPG_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(PNG, PNG_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(GIF, GIF_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(PDF, PDF_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(ZIP, ZIP_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(RAR, RAR_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(DOC, DOC_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(DOCX, DOCX_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(XLS, XLS_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(XLSX, XLSX_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(PPT, PPT_MAGIC);FILE_TYPE_MAGIC_NUMBERS.put(PPTX, PPTX_MAGIC);}/*** @param file             被校验文件* @param allowFileMaxSize 允许的文件大小,单位为字节* @return bool*/public static void isValidFile(MultipartFile file, Long allowFileMaxSize, String... fileTypes) {// 检查文件大小if (!isValidFileSize(file, allowFileMaxSize)) {throw new RuntimeException("上传文件大小超过限制: " + allowFileMaxSize);}// 检查文件类型String fileExt = getFileExtension(file);if (!isValidFileType(fileExt, fileTypes)) {log.error("暂不支持文件类型: {}", fileExt);throw new RuntimeException("暂不支持文件类型: " + fileExt);}// 额外的魔数校验if (!isValidFileMagic(file, fileTypes)) {throw new RuntimeException("文件内容和文件类型不匹配");}}/*** @param fileSuffix 文件后缀* @param fileTypes  支持的文件类型* @return*/private static boolean isValidFileType(String fileSuffix, String[] fileTypes) {boolean flag = false;if (fileTypes == null || fileTypes.length == 0) {flag = FILE_TYPE_MAGIC_NUMBERS.containsKey(fileSuffix.toLowerCase());} else {for (String fileType : fileTypes) {if (fileSuffix.equals(fileType)) {flag = true;}}}return flag;}/*** 校验文件大小** @param file             文件* @param allowFileMaxSize 允许的文件大小* @return*/private static boolean isValidFileSize(MultipartFile file, Long allowFileMaxSize) {if (allowFileMaxSize == null) {allowFileMaxSize = multipartProperties.getMaxFileSize().toBytes();}log.info("上传文件大小为: {}", file.getSize());return file.getSize() <= allowFileMaxSize;}/*** 文件魔数校验** @param file      文件* @param fileTypes 文件类型* @return*/private static boolean isValidFileMagic(MultipartFile file, String[] fileTypes) {byte[] bytes = new byte[4];try (InputStream fis = file.getInputStream()) {fis.read(bytes, 0, bytes.length);StringBuilder sb = new StringBuilder();for (byte b : bytes) {sb.append(String.format("%02X", b));}String magicNumber = sb.toString();log.info("上传文件的魔数为: {}", magicNumber);if (fileTypes == null || fileTypes.length == 0) {for (String magic : FILE_TYPE_MAGIC_NUMBERS.values()) {if (magicNumber.startsWith(magic)) {return true;}}} else {for (String fileType : fileTypes) {String magic = FILE_TYPE_MAGIC_NUMBERS.get(fileType);if (magicNumber.startsWith(magic)) {return true;}}}} catch (Exception e) {log.error("上传文件-流读取操作异常: {}", e.getMessage());return false;}return false;}/*** 返回文件后缀** @param file 文件* @return string*/private static String getFileExtension(MultipartFile file) {String suffix = "";String originalFilename = file.getOriginalFilename();if (originalFilename != null) {int lastIndex = originalFilename.lastIndexOf('.');if (lastIndex > 0) {suffix = originalFilename.substring(lastIndex + 1);}}log.info("上传的文件后缀为: {}", suffix);return suffix;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt5串口测试工具

笔者经常会遇到使用上位机进行相关测试的场景&#xff0c;但现成的上位机并不能完全满足自己的需求&#xff0c;或是上位机缺乏使用说明。所以&#xff0c;自己写&#xff1f; 环境说明 pycharm 2023.2.25 python 3.10 anaconda 环境配置 conda create -n envsram ##…

学生信息管理系统C++

设计目的 使学生进一步理解和掌握课堂上所学的面向对象C编程知识&#xff0c;巩固和加深学生对C面向对象课程的基本知识的理解和掌握。掌握C面向对象编程和程序调试的基本技能&#xff0c;学会利用C语言进行基本的软件设计&#xff0c;着重提高运用C面向对象语言解决实际问题的…

Go Modules 使用

文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules&#xff0c;所有的依赖包都是存放在 GOPATH /pkg下&#xff0c;没有版本控制。如果 package 没有做到完全的向前兼容&#xff0c;会导致多个项目无法运行(包版本需求不同)。 于是推出了g…

秋招突击——第四弹——Java的SSN框架快速入门——Spring(2)

文章目录 前言其他Spring加载properties 容器创建容器获取beanBeanFactory容器总结 注解注解开发对定义bean纯注解开发Bean管理Bean作用范围Bean生命周期 注解开发依赖注入第三方bean管理第三方bean管理第三方bean注入 注解开发总结 Spring整合整合mybatis整合Junit AOPAOP核心…

C++之通信数据交换JSON

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript语言的一个子集&#xff0c;但采用完全独立于语言的文本格式&#xff0c;这些特性使得JSON成为理想的…

【C、C++编译工具】CLion工具介绍与安装

一、问题 最近突发奇想想学学最开始接触的语言C&#xff0c;之前大学的时候用的更多的工具还是VC&#xff0c;工作后慢慢接触了CLion&#xff0c;跟pycharm其实差不多&#xff0c;都是集成开发环境&#xff08;IDE&#xff09; 解释&#xff1a;什么是 IDE&#xff1f; 根据计…

2024年5月 | deepin 深度应用商店-应用更新记录

新增应用 序号应用名称deepin 系统版本应用分类应用类型1HitPaw Watermark Removerdeepin V23图形图像wine2PDF to DOCX转换器deepin V23网络应用linux3天工 AIdeepin V20.9效率办公linux4稻壳阅读deepin 20.9 deepin V23效率办公linux5讯飞星火deepin V20.9效率办公linux6文…

扩散模型的技术原理和应用价值

引言 一、扩散模型的基本概念 扩散模型(Diffusion Models)是一种基于概率论的生成模型&#xff0c;最初源自物理学中的扩散过程理论&#xff0c;比如墨水在水中的扩散过程。在机器学习领域&#xff0c;这一概念被创造性地应用于数据生成任务&#xff0c;特别是图像和声音的合成…

Proxmox Backup Server 命名空间使用

作者&#xff1a;田逸&#xff08;formyz&#xff09; Proxmox Backup Server&#xff08;一下统称PBS&#xff09;从2.2版本开始&#xff0c;新增了命名空间这样一个功能。这个功能大大便利了多Proxmox VE集群或者单节点备份&#xff0c;在以前PBS版本中&#xff0c;如果有多个…

17、matlab实现均值滤波、中值滤波、Butterworth滤波和线性相位FIR滤波

1、创建信号 1)创建正余弦信号、噪声信号和混合信号 原始正余弦信号公式:Signal1= sin(2*pi*20* t) + sin(2*pi*40* t) + sin(2*pi*60* t) 高斯分布的白噪声:NoiseGauss= [randn(1,2000)] 均匀分布的白噪声:[rand(1,2000)] 正余弦信号、噪声信号和混合信号代码: N =…

vue项目路由跳转后上一页面未完成的接口取消请求

vue项目路由跳转后上一页面未完成的接口取消 一、 需求 在路由跳转后&#xff0c;如果上一个页面未完成的接口请求&#xff0c;需要取消掉。 比如&#xff1a; 页面A请求接口A&#xff0c;页面B请求接口B。从页面A跳转到页面B&#xff0c;如果接口A未完成&#xff0c;需要取消…

HTML旋转照片盒子

效果图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content…

世界的本质是旋转(9) 利用声波传输mFSK多音调频文本

在上一篇文章中 &#xff0c;主要介绍的是使用专用的业余无线电设备传输调相波形。 对于买不起SDR设备的学生来说&#xff0c;可以使用这篇文章介绍的思路&#xff0c;使用声卡的数据线传输IQ路的基带数据。线路输入的好处&#xff1a; 不经过空气的媒介&#xff0c;波形的本…

江苏省汽车及零部件产业协作配套对接会在苏州举行

5月28日&#xff0c;江苏省汽车及零部件产业协作配套对接会暨“百场万企”大中小企业融通对接活动在苏州举办。本次活动以“深化整零协作&#xff0c;促进大中小企业融通发展”为主题&#xff0c;由江苏省工业和信息化厅、中国中检所属中国汽车工程研究院股份有限公司&#xff…

分享7个手机上堪称神器却鲜为人知的小众宝藏软件

分享7个手机上堪称神器却鲜为人知的小众宝藏软件&#xff0c;保证大家用过就舍不得卸载~ 1.志愿大师 马上就是高考季了&#xff0c;高考完的同学如果不知道该如何选专业&#xff0c;可以用这个软件来分析各个大学和专业设置等信息。 志愿大师是一款专为高考后学生设计的高效辅…

Others - 网友都是些人才,哈哈哈哈

感谢万能的网友们&#xff01; 原本枯燥的知识&#xff0c;在网友生动形象的表达下&#xff0c;也能简单易懂&#xff0c;哈哈哈哈

Prometheus+Altermanager实现钉钉告警

PrometheusAltermanager实现钉钉告警 Prometheus和Altermanager的安装这里就不赘述了&#xff0c;我之前的文章有写到 不记得的小伙伴可以去看看Prometheus和Altermanager的安装使用 直接开始上操作 下载钉钉并打开&#xff0c;先创建一个接收告警信息的钉钉群 添加一个自定…

【Nacos_bugs】java.lang.IllegalStateException: Failed to load ApplicationContext

报错原因 找不到配置文件。 Bug 排查 如果使用 Nacos 管理配置文件&#xff0c;需要检查本地 bootstrap.yml 配置是否出现问题&#xff1a; 检查点&#xff1a; 检查 Nacos 服务的地址有没有配置错误&#xff0c;如上图 ①&#xff0c;格式严格为 IP:端口号" 检查 D…

Ant Design Vue Pro流程分析记录

一、基本介绍 Ant Design Vue Pro提供了一套完整的解决方案&#xff0c;包括路由、状态管理、UI组件库、HTTP请求封装等&#xff0c;方便开发者快速搭建和维护企业级应用。 二、官网地址 Ant Design Pro of Vue 三、下载及安装 推荐使用Yarn 四、文件分布及说明 dist&#xf…

常见Rabbitmq面试题及答案总结

1、 什么是 rabbitmq 釆用AMQP高级消息队列协议的一种消息队列技术撮大的特点就是消费并不需要 确保提供方存在,实现了服务之间的高度解耦 2、 为什么要使rabbitmq &#xff08;1&#xff09; 在分布式系统下具备异步&#xff0c;削峰&#xff0c;负载均衡等一系列高级功能&…