springboot解决XSS存储型漏洞

springboot解决XSS存储型漏洞

XSS攻击

XSS 攻击:跨站脚本攻击(Cross Site Scripting),为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆,故将跨站脚本攻击缩写为 XSS。

XSS(跨站脚本攻击):是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。类似于 sql 注入。是目前最普遍的 Web 应用安全漏洞,也是 Web 攻击中最常见的攻击方式之一。

XSS( 跨站脚本攻击)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。

XSS攻击示例
在这里插入图片描述
在这里插入图片描述

过滤请求非法内容XSS类:XssRequestWrappers

这个类用来过滤请求非法内容,详细代码如下:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;/*** @ClassName XssRequestWrappers* @Description TODO* @Author tongxueqiyue* @Date 2023/12/18 10:43* @Version 1.0*/
public class XssRequestWrappers extends HttpServletRequestWrapper {private CommonsMultipartResolver multiparResolver = new CommonsMultipartResolver();public XssRequestWrappers(HttpServletRequest request) {super(request);String type = request.getHeader("Content-Type");if (!StringUtils.isEmpty(type) && type.contains("multipart/form-data")) {MultipartHttpServletRequest multipartHttpServletRequest = multiparResolver.resolveMultipart(request);Map<String, String[]> stringMap = multipartHttpServletRequest.getParameterMap();if (!stringMap.isEmpty()) {for (String key : stringMap.keySet()) {String value = multipartHttpServletRequest.getParameter(key);striptXSS(key);striptXSS(value);}}super.setRequest(multipartHttpServletRequest);}}@Overridepublic String[] getParameterValues(String parameter) {String[] values = super.getParameterValues(parameter);if (values == null) {return null;}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = striptXSS(values[i]);}return encodedValues;}@Overridepublic String getParameter(String parameter) {String value = super.getParameter(parameter);return striptXSS(value);}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);return striptXSS(value);}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> map1 = super.getParameterMap();Map<String, String[]> escapseMap = new HashMap<String, String[]>();Set<String> keys = map1.keySet();for (String key : keys) {String[] valArr = map1.get(key);if (valArr != null && valArr.length > 0) {String[] escapseValArr = new String[valArr.length];for (int i = 0; i < valArr.length; i++) {String escapseVal = striptXSS(valArr[i]);escapseValArr[i] = escapseVal;}escapseMap.put(key, escapseValArr);}}return escapseMap;}//处理非法内容,如果有新的在此处增加即可public static String striptXSS(String value) {if (value != null) {// 替换空字符串,以便清除潜在的恶意脚本value = value.replaceAll("", "");// 移除<script>标签及其内容Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 移除带有src属性的标签,支持单引号和双引号包围的属性值scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 移除</script>标签scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 移除以<script...>开头的标签scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 移除eval()函数调用scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 移除expression()函数调用scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 移除以"javascript:"开头的字符串scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 移除以"vbscript:"开头的字符串scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// 移除以"onload..."开头的字符串scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// 移除包含任何<和>字符的字符串scriptPattern = Pattern.compile(".*<.*", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");}// 返回处理后的字符串return value;}
}

定义过滤器监听XSSFilter 重写Filter

在这个过滤器中监听XSSFilter,使用上面写的XssRequestWrappers来处理请求中的非法内容

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;/*** @ClassName XSSFilter* @Description TODO* @Author tongxueqiyue* @Date 2023/12/18 10:45* @Version 1.0*/
public class XSSFilter implements Filter {@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {chain.doFilter(new XssRequestWrappers((HttpServletRequest) request), response);}
}

注册这个XSSFilter为Bean

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean<XSSFilter> xssFilterRegistrationBean() {FilterRegistrationBean<XSSFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new XSSFilter());registrationBean.addUrlPatterns("/*"); // 这里配置需要过滤的URLregistrationBean.setName("xssFilter");registrationBean.setOrder(1); // 设置过滤器的执行顺序,数字越小越优先return registrationBean;}
}

执行这三步应该就可以了,不过启动可能会报错,如果报错添加以下依赖即可:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

到这里XSS存储型漏洞应该就能解决了

参考:
https://blog.csdn.net/qq_25580555/article/details/128237542
https://blog.csdn.net/qq_26244285/article/details/122586506

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

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

相关文章

CEC2013(python):五种算法(CSO、WOA、GWO、DBO、PSO)求解CEC2013(python代码)

一、五种算法简介 1、鸡群优化算法CSO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、粒子群优化算法PSO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Probl…

【智慧之窗】AI驱动产品探索

一.初识 ChatGPT ChatGPT 是由 OpenAI 开发的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;基于 GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构。GPT 系列的模型旨在理解和生成自然语言文本。ChatGPT 专注于支持对话性任务&#xff0c;即与…

Windows本地搭建开源企业管理套件Odoo并实现公网访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

ArcGIS Pro SDK 右键获取选中的图层

需求&#xff1a; 获取右键选中的图层 解决方法&#xff1a; 地图页面获取选中的图形 // 获取所选要素 var firstFeatureLayer MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(); 布局页面获取选中的地图框 Layout layout …

Linux系统管理、服务器设置、安全、云数据中心

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 我们来快速了解liunx命令 文章目录 前言解析命令提示符linux的文件和目录文件和目录管理文件操作 进程管理命令系统管理网络管理 书籍推荐 本文以服务器最常用的CentOS为例 解析命令提示…

自动化测试 (四) 读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…

无框架Java转go语言写http与tcp请求

项目地址 https://github.com/cmdch2017/http_tcpServer 项目结构 如何快速上手 http篇 1、controller包就相当于RestController&#xff0c;这里返回了一个Person对象&#xff0c;当你需要新建一个接口时&#xff0c;再新写一个func仿照下面的方法就行了 package control…

Java已死、前端已凉?巨大骗局!

Java已死、前端已凉&#xff1f;巨大骗局&#xff01; 1 引言2 Java的现状与挑战3 前端技术的现状与挑战4 Java和前端技术的未来发展趋势5 扩展讨论6 结论 摘要&#xff1a;近年来&#xff0c;随着技术的发展和市场需求的变化&#xff0c;Java和前端技术面临着前所未有的挑战。…

Domino 14.0消灭密码(二)

大家好&#xff0c;才是真的好。 这篇主要讲Domino 14无密码登录新功能的配置过程&#xff0c;好看&#xff0c;而且简单。 不知道上一节《Domino 14.0消灭密码&#xff08;一&#xff09;》看了和搞懂了没有。如果没搞懂也没关系&#xff0c;翻回去看看&#xff0c;或者看看…

谷歌手机安装证书到根目录

1、前提你已经root&#xff0c;安装好面具 2&#xff0c;下载movecert模块&#xff0c;自动帮你把证书从用户证书移动成系统证书 视频教程&#xff0c;手机为谷歌手机 https://www.bilibili.com/video/BV1pG4y1A7Cj?p11&vd_source9c0a32b00d6d59fecae05b4133f22f06 软件下…

新书推介——《AI摄影绘画与PS优化从入门到精通》

在这个数字化时代的浪潮中&#xff0c;人工智能技术以其惊人的创造力和创新性席卷全球。从智能助手到自动驾驶&#xff0c;从自然语言处理到机器学习&#xff0c;AI正日益成为我们日常生活和各个领域不可或缺的一部分。摄影和绘画领域也不例外&#xff0c;AI技术为我们提供了前…

字符分类函数字符转换函数

字符分类函数 在C语言当中有一系列的函数是专门做字符分类的&#xff0c;就是看这个属于什么类型字符的函数&#xff0c;这类函数的使用都需要包含一个头文件ctype.h 我们通过讲解其中一个函数带大家了解一下&#xff0c;其余的函数都是十分相似的 islower函数是属于字符分类…