Java 使用JSON消毒器从SpringMVC控制器消毒JSON响应?

Java 使用JSON消毒器从SpringMVC控制器消毒JSON响应?,java,json,spring-mvc,owasp,Java,Json,Spring Mvc,Owasp,我想截取从SpringMVC Rest控制器发回的JSON,并通过一个消毒器运行它,确保它是有效的,HTML转义任何不可靠的字符。(可能是 我们使用Jackson HTTP消息转换器将@ResponseBody转换为JSON,据我所知,一旦我将对象作为@ResponseBody返回,我将失去对它的控制 是否有一种合理的方法将JSON截取为字符串,以便在其上运行清理代码 我目前正在调查三个途径: 编写过滤器和响应包装器,在将JSON发送回客户端之前对其进行清理 以某种方式扩展JSON映射器以提供经

我想截取从SpringMVC Rest控制器发回的JSON,并通过一个消毒器运行它,确保它是有效的,HTML转义任何不可靠的字符。(可能是

我们使用Jackson HTTP消息转换器将@ResponseBody转换为JSON,据我所知,一旦我将对象作为@ResponseBody返回,我将失去对它的控制

是否有一种合理的方法将JSON截取为字符串,以便在其上运行清理代码

我目前正在调查三个途径:

  • 编写过滤器和响应包装器,在将JSON发送回客户端之前对其进行清理
  • 以某种方式扩展JSON映射器以提供经过净化的JSON
  • 编写处理程序拦截器并使用它修改响应

  • 我不确定这两个选项中的任何一个是否有效,或者是否有更合理的第三个选项。

    我知道这个答案可能太晚了,但我需要做同样的事情,所以我在JSON映射器中添加了一个序列化程序

    web配置:

    import java.util.List;
    import org.springframework.context.annotation.Bean;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void configureMessageConverters(
                List<HttpMessageConverter<?>> converters) {
            // the list is empty, so we just add our converter
            converters.add(jsonConverter());
        }
    
        @Bean
        public HttpMessageConverter<Object> jsonConverter() {
            ObjectMapper objectMapper = Jackson2ObjectMapperBuilder
                    .json()
                    .serializerByType(String.class, new SanitizedStringSerializer())
                    .build();
            return new MappingJackson2HttpMessageConverter(objectMapper);
        }
    }
    
    import java.util.List;
    导入org.springframework.context.annotation.Bean;
    导入org.springframework.http.converter.HttpMessageConverter;
    导入org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    导入org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    导入org.springframework.web.servlet.config.annotation.EnableWebMvc;
    导入org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter;
    导入com.fasterxml.jackson.databind.ObjectMapper;
    @EnableWebMvc
    公共类WebConfig扩展了WebMVCConfigureAdapter{
    @凌驾
    公共无效配置MessageConverters(
    
    ListHTML为什么要转义JSON?JSON应该包含未格式化的数据,这样任何类型的客户端都可以使用它来显示它。如果客户端选择在HTML中插入这些数据,那么正确地插入这些数据是客户端的责任,而不是服务器的责任。我对这个问题的理解是,我们希望确保如果从后端请求,以前插入的数据不能做任何不好的事情。我在第11个小时被叫进来,并被告知要确保在和JSON消息的输出中转义以下字符:%,&,*,$,#,@,!,\,/,:,*,?,,,,,,,,,,,;,'
    import java.io.IOException;
    import org.apache.commons.lang3.StringEscapeUtils;
    import com.fasterxml.jackson.core.JsonGenerationException;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.ser.std.NonTypedScalarSerializerBase;
    
    public class SanitizedStringSerializer extends NonTypedScalarSerializerBase<String> {
    
        public SanitizedStringSerializer() { 
            super(String.class); 
        }
    
        @Override
        public void serialize(String value, JsonGenerator jgen, SerializerProvider provider)
                throws IOException, JsonGenerationException {
            jgen.writeRawValue("\"" + StringEscapeUtils.escapeHtml4(value) + "\"");
        }
    }