mica-xss 组件
说明
- 对表单绑定的字符串类型进行 xss 处理。
- 对 json 字符串数据进行 xss 处理。
- 提供路由和控制器方法级别的放行规则。
- 对表单和 json 字符串 trim 处理。
使用
maven
xml
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-xss</artifactId>
<version>${version}</version>
</dependency>gradle
groovy
compile("net.dreamlu:mica-xss:${version}")默认配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| mica.xss.enabled | true | 开启xss |
| mica.xss.mode | clear | 模式:clear 清理(默认)、escape 转义、validate 校验(2.7.4新增) |
| mica.xss.pretty-print | false | clear 专用 prettyPrint,默认关闭: 保留换行 |
| mica.xss.enable-escape | false | clear 专用 转义,默认关闭 |
| mica.xss.path-patterns | /** | 拦截的路由,例如: /api/order/** |
| mica.xss.path-exclude-patterns | 放行的路由,默认为空 | |
| mica.xss.path-exclude-patterns | 放行的路由,默认为空 |
xss.form 配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| mica.xss.form.trim-text | true | 是否去除字符串首尾空格 |
| mica.xss.form.chars-to-delete | 需要去除的特殊字符,按字符去除 | |
| mica.xss.form.empty-as-null | false | 去除首尾空格后,空字符串转null |
| mica.xss.form.enable-in-collection | false | [trim-text, chars-to-delete, empty-as-null]三个规则,对集合中的元素也生效 |
xss.jackson 配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| mica.xss.jackson.trim-text | true | 是否去除字符串首尾空格 |
| mica.xss.jackson.chars-to-delete | 需要去除的特殊字符,按字符去除 | |
| mica.xss.jackson.empty-as-null | false | 去除首尾空格后,空字符串转null |
注解
可以使用 @XssCleanIgnore 注解对方法和类级别进行忽略。
针对某个 json 对象 String 字段处理
- 添加
@XssCleanIgnore注解对路由忽略 xss 处理。 - 对需要处理得字段添加
@JsonDeserialize(using = XssCleanDeserializer.class)注解。
自定义 xss 清理
如果内置的 xss 清理规则不满足需求,可以自己实现 XssCleaner,注册成 Spring bean 即可。
1. 注册成 Spring bean
java
@Bean
public XssCleaner xssCleaner() {
return new MyXssCleaner();
}2. MyXssCleaner
java
public class MyXssCleaner implements XssCleaner {
@Override
public String clean(String html) {
Document.OutputSettings settings = new Document.OutputSettings()
// 1. 转义用最少的规则,没找到关闭的方法
.escapeMode(Entities.EscapeMode.xhtml)
// 2. 保留换行
.prettyPrint(false);
// 注意会被转义
String escapedText = Jsoup.clean(html, "", XssUtil.HtmlWhitelist.INSTANCE, settings);
// 3. 反转义
return Entities.unescape(escapedText);
}
}校验模式
校验模式会抛出异常,可以使用 Spring boot 的全局异常处理。
| 模式 | 抛出的异常 |
|---|---|
| jackson | HttpMessageNotReadableException |
| form | MethodArgumentConversionNotSupportedException |
获取 XssException
java
Throwable rootCause = NestedExceptionUtils.getRootCause(e);
if (rootCause instanceof XssException) {
// xss 的异常
}手动清理
对于部分场景可以选择手动处理,注入 XssCleaner 调用方法即可。
java
@Autowired
private XssCleaner xssCleaner;mica-xss 不生效???
- Spring 5.0 (Spring boot 2.0) 开始项目里有继承
WebMvcConfigurerAdapter、WebMvcConfigurationSupport的要改成实现WebMvcConfigurer。 - 排查是否自定义了 Jackson ObjectMapper bean 或者是自定义了 String 字符串序列化。