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 中执行过滤。

  1. 核心过滤逻辑

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

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

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

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

Spring Boot XSS 攻击过滤插件使用的更多相关文章

  1. spring boot 整合pagehelper分页插件

    Spring Boot 整合pagehelper分页插件 测试环境: spring boot  版本 2.0.0.M7 mybatis starter 版本  1.3.1 jdk 1.8 ------ ...

  2. # 防止xss攻击,过滤script标签,获取出标签外的内容

    from bs4 import BeautifulSoups = '<h1>123</h1> <span>456<span>'soup = Beauti ...

  3. HTML标签防XSS攻击过滤模块--待优化

    HTML标签防XSS攻击过滤模块 http://cnodejs.org/topic/5058962f8ea56b5e7806b2a3

  4. spring boot集成mybatis分页插件

    mybatis的分页插件能省事,本章记录的是 spring boot整合mybatis分页插件. 1.引入依赖 <!-- 分页插件pagehelper --> <dependency ...

  5. PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数

    XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function ...

  6. 文本XSS攻击过滤

    在FCK或百度编辑器等常用富文本编辑器中,通常是会被XSS攻击 处理方法: 文本框模拟输入了以下文本 <span style="dispaly:none" onclick=& ...

  7. XSS攻击过滤处理

    关于XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. XSS漏洞的危害 网络钓鱼,包括盗取各类用户账号: 窃取用户cooki ...

  8. Spring Boot MyBatis 通用Mapper插件集成 good

    看本文之前,请确保你已经在SpringBoot中集成MyBatis,并能正常使用.如果没有,那么请先移步 http://blog.csdn.net/catoop/article/details/505 ...

  9. spring boot中利用mybatis-generator插件生成代码

    使用Idea在spring boot中集成mybatis-generator,自动生成mapper.xml  model  dao 文件 一.配置 pom.xml 在pom.xml的<plugi ...

随机推荐

  1. C语言指针基本知识

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

  2. 鸿蒙Java开发模式11:鸿蒙图片裁剪功能的实现

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 目录: 1. 鸿蒙版图片裁剪功能效果展示 2.Java代码实现 3.裁剪工具类实现 4.<鸿蒙Java开发模式>系 ...

  3. CentOS7集群环境Elastic配置

    CentOS7集群环境Elastic配置 (首先去官网下载elasticsearch的source code并解压到/usr/soft目录下) (以下默认root账户) 1.更改配置文件 文件路径:/ ...

  4. Basic认证时添加请求头

    http Basic认证 http协议定义的一种认证方式,将客户端id和客户端密码按照"客户端ID:客户端密码"的格式拼接,并用base64编 码,放在header中请求服务端, ...

  5. 记录vue springboot 跨域采坑

    vue配置 域名src\main.js要与config\index.js一样 var axios = require('axios')axios.defaults.baseURL = 'http:// ...

  6. js中数据、内存、变量的概念及三者之间的关系

    目录 数据.内存.变量的概念及三者之间的关系 什么是数据 数据的特点 什么是内存 栈内存 堆内存 JS引擎如何管理内存 什么是变量 变量是普通类型时 变量是引用类型时 数据.内存.变量的三者之间的关系 ...

  7. 通过 .NET NativeAOT 实现用户体验升级

    前言 TypedocConverter 是我先前因帮助维护 monaco-editor-uwp 但苦于 monaco editor 的 API 实在太多,手写 C# 的类型绑定十分不划算而发起的一个项 ...

  8. 【HTB系列】靶机Netmon的渗透测试

    出品|MS08067实验室(www.ms08067.com) 本文作者:是大方子(Ms08067实验室核心成员) 总结和反思: win中执行powershell的远程代码下载执行注意双引号转义 对po ...

  9. (报错解决)Exception encountered during context initialization

    转: (报错解决)Exception encountered during context initialization 关键词 JavaEE JavaWeb eclipse XML AspectJ ...

  10. HDOJ-6621(线段树+二分法)

    K-th Closest Distance HDOJ-6621 本题可以使用线段树解决,结点存本结点对应的所有元素,并按照从小打到排序 最后使用二分法求解答案.因为题目中有绝对值,所以需要使用两次查找 ...