Spring Boot 中一种防止 @RequestBody 接收 Json 数据导致 XSS 攻击的简单方法


问题

前后端分离项目,对于 POST 和 PUT 类型的请求方法,后端基本都是通过 @RequestBody 注解接收 application/json 格式的请求数据,以往那种通过过滤器 Filter + 装饰器 Wrapper 来防止表单传参 XSS 攻击的方式并不适用。在 Spring Boot 中,我们可以通过配置全局的 Json 反序列化器转义特殊字符来防止 XSS 攻击。

代码

GlobalJsonDeserializer.java 🔗
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* JSON 全局反序列化器
*
* @author xiongxiaoyang
* @date 2022/5/21
*/
@JsonComponent
public class GlobalJsonDeserializer {

/**
* 字符串反序列化器:过滤特殊字符,解决 XSS 攻击
*/
public static class StringDeserializer extends JsonDeserializer<String> {

@Override
public String deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
// 实际代码就这一行
return jsonParser.getValueAsString()
.replace("<", "&lt;")
.replace(">", "&gt;");
}

}

}