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

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐