2015-08-21 99 views
4

我想拦截从Spring MVC Rest Controller发回的JSON,并通过一个消毒器运行它,以确保它是有效的,并且HTML转义任何可笑的字符。 (可能是OWASP JSON Sanitizer使用JSON Sanitizer从Spring MVC控制器消毒响应JSON?

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

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

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

  1. 写一个过滤器和ResponseWrapper此类之前,它发回给客户端,进行消毒的JSON。
  2. 扩展JSON映射器以某种方式提供消毒的JSON。
  3. 编写处理程序拦截器并使用它来修改响应。

我不确定这些工作是否有效,或者是否有更合理的第三种选择。

+0

为什么你会HTML转义JSON? JSON应该包含未格式化的数据,以便任何类型的客户端都可以使用它来显示它,但是它是想要的。如果客户选择以HTML格式插入这些数据,则客户有责任正确执行此操作。不是服务器。 –

+0

我对这个问题的理解是,我们希望确保任何恶意插入的数据在后台请求时都不会做任何调皮的事情。 我已经在第11小时接到通知,并要求确保以下字符在JSON消息的输出中转义: %,&,*,$,#,@,!,\,/, :,*,?,“,<, >,|,;,', –

回答

2

我知道这个答案可能太晚了,但我需要做同样的事情,所以我添加了一个序列化程序到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.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) + "\""); 
    } 
}