关于xss过滤,网上大都是是对 param的,这个很多文章了 定义过滤器。XSSFilter 不说了,
参考 https://blog.csdn.net/yucaifu1989/article/details/61616554
还有就是对所有@ResponseBody 返回内容做XSS过滤的方案:
MappingJackson2HttpMessageConverter 的objectMapper 做设置
参考 百度
那么对 @RequestBody 的 json 数据怎么过滤呢:
spring处理json是通过MappingJackson2HttpMessageConverter实现的。
MappingJackson2HttpMessageConverter 里是用的 objectMapper 做的反序列化,从 json 字符串反序列化到java对象。
我们的目的是把 入参 json中的 字符串对象做xss过滤
jackson 可以自定义 Deserializer,我们就用这个来处理
public class StringXssDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String source = p.getText().trim();
// 把字符串做XSS过滤
return StringEscapeUtils.escapeHtml4(source);
}
}
把MappingJackson2HttpMessageConverter 中的 :
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter htmlEscapingConverter = new MappingJackson2HttpMessageConverter();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addDeserializer(String.class, new StringXssDeserializer());
htmlEscapingConverter.getObjectMapper().registerModule(simpleModule);
return htmlEscapingConverter;
}
Done
该方案无法对单个字段做特殊处理,全部会被转义。
本方案 对 @RequestBody String 无效
// 对下面的 RequestBody无效
@RequestMapping("test")
public String testxssstr(@RequestBody String data) {
}