springboot XSS防御

本文介绍了一种避免XSS攻击的方法,即在响应数据时处理特殊字符,而不是在请求数据中过滤。通过自定义JSON序列化器,使用HtmlUtils.htmlEscape对字符串进行转义,确保在前端展示时安全,同时避免了误伤原始数据。配置示例展示了如何在Spring Boot应用中注册此序列化器,以处理JSON响应中的潜在XSS风险。
摘要由CSDN通过智能技术生成

       通常网上搜索到的xss解决方案大多数都是增加filter,将所有带< > /等特殊字符转换,实践中这种方式确实可以防止xss攻击,但是请求数据会误伤,将原本<>字符转义后放入数据库,如果字符是大于号或者小于号的作用时,后端处理容易出现问题。

      其实xss问题无非就是展示到前端的时候出现问题,所以我们可以在response的时候将数据处理,,这样就不会出现入参数据误伤问题,最直接的解决办法就是将序列化进行调整,在序列化的时候将特殊字符进行处理就可以解决xss问题

代码:

1、写个序列化,用HtmlUtils.htmlEscape进行数据处理

public class XssStringJsonSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(HtmlUtils.htmlEscape(s));
    }
}

2、将序列化注册上

@Slf4j
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@EnableConfigurationProperties({
        WebMvcProperties.class,
        ResourceProperties.class,
        WebProperties.class
})
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
@EnableWebMvc
@ComponentScan
public class WebAutoConfiguration implements WebMvcConfigurer, ApplicationContextAware {

    @Autowired
    private WebProperties webProperties;

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();

        
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(String.class, new XssStringJsonSerializer());
        objectMapper.registerModule(simpleModule);
        
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
     
        List<MediaType> mediaTypes = Arrays.asList(
                MediaType.APPLICATION_JSON,
                MediaType.TEXT_PLAIN,
                MediaType.TEXT_HTML,
                MediaType.TEXT_XML,
                MediaType.APPLICATION_OCTET_STREAM,
                MediaType.valueOf("application/vnd.spring-boot.actuator.v3+json"));
        jackson2HttpMessageConverter.setSupportedMediaTypes(mediaTypes);
        converters.add(jackson2HttpMessageConverter);
    }
}

通过以上操作,就可以将响应数据中的html关键字给处理掉,解决前端的xss问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值