Java 使用JSON消毒器从SpringMVC控制器消毒JSON响应?
我想截取从SpringMVC Rest控制器发回的JSON,并通过一个消毒器运行它,确保它是有效的,HTML转义任何不可靠的字符。(可能是 我们使用Jackson HTTP消息转换器将@ResponseBody转换为JSON,据我所知,一旦我将对象作为@ResponseBody返回,我将失去对它的控制 是否有一种合理的方法将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映射器以提供经
我不确定这两个选项中的任何一个是否有效,或者是否有更合理的第三个选项。我知道这个答案可能太晚了,但我需要做同样的事情,所以我在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) + "\"");
}
}