Spring Boot XSS 攻击过滤插件使用

 更新时间:2020年12月03日 09:49:56   作者:冷冷zz  
这篇文章主要介绍了Spring Boot XSS 攻击过滤插件使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

XSS 是什么

XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS 是一种常见 web 安全漏洞,它允许恶意代码植入到提供给其它用户使用的页面中。

xss 攻击流程

简单 xss 攻击示例若网站某个表单没做相关的处理,用户提交相关恶意代码,浏览器会执行相关的代码。

解决方案

XSS 过滤说明

  • 对表单绑定的字符串类型进行 xss 处理。
  • 对 json 字符串数据进行 xss 处理。
  • 提供路由和控制器方法级别的放行规则。

使用 mica-xss

引入一下 依赖即可

<!--XSS 安全过滤-->
		<dependency>
			<groupId>net.dreamlu</groupId>
			<artifactId>mica-core</artifactId>
			<version>2.0.9-GA</version>
		</dependency>
		<dependency>
			<groupId>net.dreamlu</groupId>
			<artifactId>mica-xss</artifactId>
			<version>2.0.9-GA</version>
		</dependency>

测试 XSS 过滤

测试 GET 参数过滤创建目标接口,模拟 get 提交

@GetMapping("/xss")
public String xss(String params){
 return params;
}

返回为空

⋊> ~ curl --location --request GET 'http://localhost:8080/xss?params=%3Cscript%3Ealert(%27xxx%27)%3C/script%3E'

测试 POST form 参数过滤创建目标接口,模拟 post form 提交

@PostMapping("/xss")
public String xss(String params){
 return params;
}

返回为空

curl --location --request POST 'http://localhost:8080/xss' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'params=<script>alert('\''xxx'\'')</script>'

测试 POST body 参数过滤创建目标接口,模拟 post body 提交

 @PostMapping("/xss")
  public String xss(@RequestBody Map<String,String> body){
    return body.get("params");
  }

返回为空

curl --location --request POST 'http://localhost:8080/xss' \
--header 'Content-Type: application/json' \
--data-raw '{
  "params":"<script>alert('\''XXX'\'')</script>"
}'

跳过某些接口过滤

可以使用 @XssCleanIgnore 注解对方法和类级别进行忽略。

@XssCleanIgnore
@PostMapping("/xss")
public String xss(@RequestBody Map<String,String> body){
 return body.get("params");
}

原理分析

常见实现剖析

目前网上大多数的方案如下图,新增 XssFilter 拦截用户提交的参数,进行相关的转义和黑名单排除,完成相关的业务逻辑。在整个过程中最核心的是通过包装用户的原始请求,创建新的 requestwrapper 保证请求流在后边的流程可以重复读。

mica-xss 实现

1. 自定义 WebDataBinder 编辑器支持 form 过滤

Spring WebDataBinder 的作用是从 web request 中把 web 请求里的parameters绑定到对应的JavaBean上,在 Controller 方法中的参数类型可以是基本类型,也可以是封装后的普通 Java 类型。若这个普通的 Java 类型没有声明任何注解,则意味着它的每一个属性都需要到 Request 中去查找对应的请求参数,而 WebDataBinder 则可以帮助我们实现从 Request 中取出请求参数并绑定到 JavaBean 中。

SpringMVC 在绑定的过程中提供了用户自定义编辑绑定的接口,注入即可在参数绑定 JavaBean 过程中执行过滤。

2. 自定义 JsonDeserializer 反序列化支持 Json 过滤

在 Spring Boot 中默认是使用 Jackson 进行序列化和反序列化 JSON 数据的,那么除了可以用默认的之外,我们也可以编写自己的 JsonSerializer 和 JsonDeserializer 类,来进行自定义操作。用户提交 JSON 报文会通过 Jackson 的 JsonDeserializer 绑定到 JavaBean 中。我们只需要自定义 JsonDeserializer 即可完成在绑定 JavaBean 中执行过滤。

核心过滤逻辑

在 mica-xss 中并未采取上文所述通过自己手写黑名单或者转义方式的实现方案,而是直接实现 Jsoup 这个工具类。

jsoup 实现 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。

  • 从 URL,文件或字符串中刮取和解析 HTML
  • 使用 DOM 遍历或 CSS 选择器查找和提取数据
  • 操纵 HTML 元素,属性和文本
  • 清除用户提交的内容以防止安全白名单,以防止 XSS 攻击
  • 输出整洁的 HTML

到此这篇关于Spring Boot XSS 攻击过滤插件使用的文章就介绍到这了,更多相关Spring Boot XSS攻击过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java CompletableFuture使用方式

    Java CompletableFuture使用方式

    这篇文章主要介绍了Java CompletableFuture使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Boot非Web项目运行的方法

    Spring Boot非Web项目运行的方法

    这篇文章主要给大家介绍了关于Spring Boot非Web项目运行的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 解决IDEA鼠标点击光标变大问题

    解决IDEA鼠标点击光标变大问题

    这篇文章主要介绍了解决IDEA鼠标点击光标变大问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 一文掌握Java的工具类和API

    一文掌握Java的工具类和API

    在Java中,工具类通常包含一系列静态方法,用于执行常见的任务,这些任务可能不直接关联到特定的业务逻辑,而是用于处理一些基础的数据转换、字符串操作、文件操作等,这篇文章主要介绍了一文搞懂Java的工具类和API,需要的朋友可以参考下
    2008-01-01
  • 配置Spring4.0注解Cache+Redis缓存的用法

    配置Spring4.0注解Cache+Redis缓存的用法

    本篇文章主要介绍了详解配置Spring4.0注解Cache+Redis缓存的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringCloud中的Consul详解

    SpringCloud中的Consul详解

    这篇文章主要介绍了SpringCloud中的Consul知识,本文使用的是docker-compose方式管理consul服务,直接启动即可,需要的朋友可以参考下
    2022-03-03
  • mybatis-plus 判断isnull or的操作

    mybatis-plus 判断isnull or的操作

    这篇文章主要介绍了mybatis-plus 判断isnull or的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot+Mybatis实现Mapper接口与Sql绑定几种姿势

    SpringBoot+Mybatis实现Mapper接口与Sql绑定几种姿势

    通常我们在使用Mybatis进行开发时,会选择xml文件来写对应的sql,然后将Mapper接口与sql的xml文件建立绑定关系,然后在项目中调用mapper接口就可以执行对应的sql,感兴趣的可以学习一下
    2021-09-09
  • java字符串常用操作方法(查找、截取、分割)

    java字符串常用操作方法(查找、截取、分割)

    今天小编就为大家分享一篇java字符串常用操作方法(查找、截取、分割),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java和Dubbo的SPI机制原理解析

    Java和Dubbo的SPI机制原理解析

    这篇文章主要介绍了Java和Dubbo的SPI机制原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论