使用JSON Sanitizer清理Spring MVC Controller的响应JSON?

时间:2015-08-21 09:58:01

标签: java json spring-mvc owasp

我想拦截从Spring MVC Rest Controller发回的JSON,并通过一个清理程序运行它,确保它有效,HTML可以逃脱任何狡猾的角色。 (可能是 OWASP JSON Sanitizer





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


&#xA ;

是否有一种明智的方法可以拦截JSON作为字符串来运行清理代码?





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




    

  1. 编写一个过滤器和ResponseWrapper,在将JSON发送回客户端之前对其进行清理。
  2. 

  3. 扩展JSON映射器以某种方式提供已清理的JSON。
  4. 

  5. 编写处理程序拦截器并使用它来修改响应。
  6. 

&#xA;&#xA; <我不确定这些中的任何一个是否有效,或者是否有更合理的第三种选择。

&#xA;

1 个答案:

答案 0 :(得分:4)

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

网络配置:

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.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) + "\"");
    }
}