SpringBoot配置XSS过滤器基于mica-xss
1. 业务概述
1.1 XSS简介
XSS攻击即跨站点脚本攻击(Cross Site Script),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。通俗的讲就是通过web应用可输入参数,输入script脚本实现xss攻击。主要防御措施是通过web页面关键字特殊字符过滤。
常见网络攻击详解:https://blog.csdn.net/m0_37583655/article/details/123948614
1.2 需求概述
在常见的开发中需要注意xss跨站脚本的攻击,需要对参数关键字做一些校验与过滤,避免将script脚本存入数据库或者造成数据泄漏等安全问题,mica则是常见的开发工具包,其提供的xss功能可以解决该问题,避免xss攻击,当然方式有很多,通过jsonp或者过滤器也可以实现,为了避免重复造轮子,这里采用mica-xss方式实现。
2. mica概述
2.1 mica简介
Mica,Spring Cloud 微服务开发核心包,支持 web 和 webflux。
2.1 mica对应springboot版本信息
最新版本 | mica版本 | spring boot 版本 | spring cloud 版本 |
---|---|---|---|
2.6.6 | mica 2.6.x | 2.6.x | 2021 |
2.5.8 | mica 2.5.x | 2.5.x | 2020 |
2.4.11 | mica 2.4.x | 2.4.x | 2020 |
2.1.1-GA | mica 2.0.x~2.1.x | 2.2.x ~ 2.3.x | Hoxton |
2.2 mica核心功能
mica-auto (Spring boot starter 利器): https://gitee.com/596392912/mica-auto
mica-weixin(jfinal weixin 的 spring boot starter): https://gitee.com/596392912/mica-weixin
mica-mqtt(基于 t-io 实现的 mqtt组件): https://gitee.com/596392912/mica-mqtt
Spring cloud 微服务 http2 方案(h2c): https://gitee.com/596392912/spring-cloud-java11
mica-security(mica权限系统 vue 改造中): https://gitee.com/596392912/mica-security
2.3 mica协议文档
mica采用LGPL(GNU Lesser General Public License)协议。
LGPL 是 GPL 的一个为主要为类库使用设计的开源协议。和 GPL 要求任何使用/修改/衍生之 GPL 类库的的软件必须采用 GPL 协议不同。LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。
但是如果修改 LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此 LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
mica相关文档
mica 源码 Github:https://github.com/lets-mica
mica 源码 Gitee(码云):https://gitee.com/596392912/mica
mica 性能压测:https://github.com/lets-mica/mica-jmh
文档地址(官网):http://wiki.dreamlu.net
文档地址(语雀-可关注订阅):https://www.yuque.com/dreamlu
mica gitee:https://gitee.com/596392912/mica
mica2.x使用文档:https://www.dreamlu.net/mica2x/index.html
跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss):https://www.cnblogs.com/cao-lei/p/14101782.html
3. SpringBoot集成mica-xss
3.1 maven依赖
<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>
3.2 代码实现
UserController
package com.zrj.flowable.controller;
import com.zrj.flowable.entity.UserEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 用户控制器
*
* @author zrj
* @since 2022/4/4
**/
@Slf4j
@RestController
@RequestMapping(value = "user")
@Api(tags = "UserController", description = "用户控制器")
public class UserController {
/**
* 获取用户信息
* 当参数username=<script>alert(666)</script>
* 接收不到username参数,username=null
*
* @param user 用户对象
* @return
*/
@GetMapping("/get")
@ApiOperation("普通方式,获取用户信息")
public String get(UserEntity user) {
log.info("【普通方式】获取用户信息,user:{}", user);
return user.toString();
}
/**
* 获取用户名称
* 不会把参数username=<script>alert(666)</script>过滤掉
*
* @param username 用户名称
* @return
*/
@GetMapping("/getUserName")
@ApiOperation("普通方式,获取用户名称")
public String getUserName(String username) {
log.info("【普通方式】获取用户名称,username:{}", username);
return username;
}
/**
* 获取用户名称
* 跳过过滤, 在Controller或者方法上添加注解@XssCleanIgnore。
* 会把参数username=<script>alert(666)</script>过滤掉
*
* @param username 用户名称
* @return
*/
@XssCleanIgnore
@GetMapping("/getRegisterUserName")
@ApiOperation("过滤方式,获取用户名称")
public String getRegisterUserName(String username) {
log.info("【过滤方式】获取用户名称,username:{}", username);
return username;
}
}
UserEntity
package com.zrj.flowable.entity;
import lombok.Data;
/**
* @author zrj
* @since 2022/4/4
**/
@Data
public class UserEntity {
/**
* 用户ID
*/
private String id;
/**
* 用户名称
*/
private String username;
}
3.3 测试验证
xss防御主要是通过@XssCleanIgnore注解实现。正常请求不会把参数username=。