对 spring中的 @RequestBody json 请求数据做 XSS过滤

关于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 {
    @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) {
}

你可能感兴趣的:(对 spring中的 @RequestBody json 请求数据做 XSS过滤)