跨站脚本工具(cross 斯特scripting),为不和层叠样式表(cascading style sheets,CSS)的缩写混淆,
故将跨站脚本攻击缩写为XSS。恶意攻击者往web页面里插入恶意ScriptScript代码,当用户浏览该页之时,
嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。防止XSS攻击简单的预防就是对Request
请求中的一些参数去掉一些比较敏感的脚本命令。

原本是打算通过SpringMVC的HandlerInterceptor机制来实现的,通过获取request然后对request中的参数
进行修改,结果虽然值修改了,但在Controller中获取的数值还是没有修改的。没办法就是要Filter来完成。
简单来说就是创建一个新的HttpRequest类XssHttpServletRequestWrapper,然后重写一些get方法(获取
参数时对参数进行XSS判断预防)。

作者:Qihang
链接:https://www.jianshu.com/p/a7f9a4f217b4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

-流程梳理

包装request->创建过滤器->添加过滤器

1.创建包装request的类 XssHttpServletRequestWrapper

package cn.lyhxh.config;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;/*** Created by Ran Han on 2017/12/22.*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@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] = cleanXSS(values[i]);}return encodedValues;}@Overridepublic String getParameter(String parameter) {String value = super.getParameter(parameter);if (value != null) {return cleanXSS(value);}return null;}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);if (value == null)return null;return cleanXSS(value);}private static String cleanXSS(String value) {value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");value = value.replaceAll("%3C", "&lt;").replaceAll("%3E", "&gt;");value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");value = value.replaceAll("%28", "(").replaceAll("%29", ")");value = value.replaceAll("'", "'");value = value.replaceAll("eval\\((.*)\\)", "");value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");value = value.replaceAll("script", "");return value;}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers(super.getInputStream ()).getBytes ());return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) { }};}public   String inputHandlers(ServletInputStream servletInputStream){StringBuilder sb = new StringBuilder();BufferedReader reader = null;try {reader = new BufferedReader(new InputStreamReader(servletInputStream, Charset.forName("UTF-8")));String line = "";while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {if (servletInputStream != null) {try {servletInputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return  cleanXSS(sb.toString ());}}

注意:
getInputStream()方法的流处理,注解方式获取数据貌似是根据这个流取得的数据。
因为super.getInputStream()流只允许读取一次,所以在getInputStream()方法中
处理完流数据后返回了一个新的ServletInputStream。另外替换方法里的替换规则,
也可以根据实际业务需要进行调整。

作者:Qihang
链接:https://www.jianshu.com/p/a7f9a4f217b4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

2.创建过滤器 MyXssFilter

package cn.lyhxh.config;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/***  * 使用注解标注过滤器* @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器* 属性filterName声明过滤器的名称,可选* 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)* Created by Ran Han on 2017/12/19.*/
@WebFilter(filterName="myXssFilter", urlPatterns="/*")
public class MyXssFilter implements Filter {FilterConfig filterConfig = null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");this.filterConfig = filterConfig;}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("执行过滤操作");filterChain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest)servletRequest), servletResponse);}@Overridepublic void destroy() {System.out.println("过滤器销毁");this.filterConfig = null;}}

3.添加过滤器
方式1(使用注解)
在程序入口添加注解 @ServletComponentScan(也就是SpringBoot启动类)
在过滤器上添加注解 @WebFilter(filterName=“myXssFilter”, urlPatterns="/*")
方式2(使用Java Bean)(如下图JavaBean)

public class WebInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) throws ServletException {servletContext.addListener(RequestContextListener.class);FilterRegistration.Dynamic XssfilterRegistration = servletContext.addFilter("XssSqlFilter",XssFilter.class);XssfilterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/*");}
}

只要输入提交到数据库都会被转义列如会将alert(“弹死你”);转义成&#…,从而在页面取值的时候就不会发生意外。
由于前面提到的本项目采用的是注入方式,虽然是web项目但并没有web.xml文件所以添加过滤器是实现了WebApplicationInitializer类的方法onStartup(),当然也可以添加拦截器。

Spring Boot 防止XSS攻击相关推荐

  1. Java 防止XSS攻击(Spring boot Spring 方式)

    以下方式的pom依赖都基于hutool <dependency><groupId>cn.hutool</groupId><artifactId>huto ...

  2. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  3. java 过滤攻击报文_Spring Boot XSS 攻击过滤插件使用

    XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...

  4. spring boot实战之XSS过滤

    XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...

  5. Spring Boot 项目使用Spring Security防护CSRF攻击实战

    Spring Boot与Spring Security Spring Boot项目结合Spring Security ,可以实现用户认证和用户授权. Spring Security的用户认证可以是配置 ...

  6. Spring Boot自定义 Servlet Filter 的两种方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 针 ...

  7. 10 种保护 Spring Boot 应用的绝佳方法

    Spring Boot大大简化了Spring应用程序的开发.它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量,如果你已经习惯了Spring和大量XML配置,Spring Boot无疑是一 ...

  8. 20 道 Spring Boot 面试题

    面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...

  9. 这 6 个 Spring Boot 项目够经典

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:Nginx 为什么快到根本停不下来?个人原创100W+访问量博客:点击前往,查看更多 不得不佩服 Spring B ...

最新文章

  1. Yolo(1)Yolo v1
  2. 中国“5G+工业互联网”发展报告
  3. 59 Celery架构
  4. 产品运营必须知道的几个概念,如何进行网页分析?
  5. BootCDNApi使用记录
  6. 容器编排技术 -- Kubernetes kubectl rollout resume 命令详解
  7. JPA基础(四):第一个JPA实例与JPA主键生成策略
  8. project a vertex along its normal onto a triangle
  9. Microsoft Office Visio 2007
  10. 基于javaweb+jsp的员工绩效考核管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap Ajax)
  11. 计算机网络中特有符号,计算机基础知识测试题-一肖中特免费公开资料.doc
  12. vue2.0 axios封装
  13. 类Dota2服务器架构
  14. The Journal of Neuroscience: 珠心算训练有助于提高儿童的视觉空间工作记忆
  15. 第一章 时空、运动
  16. Red Rover 简单字符串应用
  17. oracle dbca没有,ORACLE 使用DBCA静默创建数据库
  18. 争取能让大家都能看懂的 DFA 算法
  19. UE4《大象无形》学习笔记
  20. python读取文件夹下txt文件,并转化成excel

热门文章

  1. 可迭代对象和迭代器对象
  2. Android手机USB调试安全闲扯(315晚会免费充电桩事件)
  3. 【91xcz】笔者支招:电脑打不出字来怎么办
  4. CAD动态块操作实例:距离乘数
  5. 女程序员的键盘,你一定没见过!
  6. 2021龙小丽高考成绩查询,2021届的考生迎来好消息,志愿填报将更有保障,家长欢呼雀跃...
  7. amd同步多线程_多核多线程,Intel 和 AMD 具体差在哪里?
  8. TechEd上的51CTO
  9. 监控进程的内存占用,CPU消耗,并将结果写入csv文件中
  10. 【C语言】交换两个变量的值 的n种方法