使用 JSON Sanitizer 清理来自 Spring MVC 控制器的响应 JSON?

Posted

技术标签:

【中文标题】使用 JSON Sanitizer 清理来自 Spring MVC 控制器的响应 JSON?【英文标题】:Sanitizing response JSON from Spring MVC Controller using JSON Sanitizer? 【发布时间】:2015-11-15 05:38:02 【问题描述】:

我想截获从 Spring MVC Rest Controller 发回的 JSON,并通过一个确保其有效且 html 转义任何不可靠字符的清理程序运行它。 (可能是OWASP JSON Sanitizer)

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

是否有一种明智的方法可以将 JSON 作为字符串截获以在其上运行清理代码?

我目前正在研究三种途径:

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

我不确定这两种方法是否可行,或者是否有更明智的第三种选择。

【问题讨论】:

为什么要对 JSON 进行 HTML 转义? JSON 应该包含未格式化的数据,因此任何类型的客户端都可以使用它来显示它想要的任何内容。如果客户端选择在 HTML 中插入此数据,那么客户端有责任正确执行此操作。不是服务器。 我对这个问题的理解是,我们希望确保任何恶意插入的数据在后端请求时都不会做任何调皮的事情。我在第 11 个小时被叫来,并被告知确保以下字符在 JSON 消息的输出中被转义:%、&、*、$、#、@、!、\、/、:、*、 ?, ", , |, ;, ' 【参考方案1】:

我知道这个答案可能为时已晚,但我需要做同样的事情,所以我在 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) + "\"");
    

【讨论】:

以上是关于使用 JSON Sanitizer 清理来自 Spring MVC 控制器的响应 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

支持样式标签的 .NET 的 HTML Sanitizer

在Android上使用Address Sanitizer构建但使用CMake

如何在 React-Redux 中将 state sanitizer 与现有的中间件结合起来

用于 HTML 清理的库

sanitizer 内存泄露检查工具的使用

使用 Address Sanitizer 编译程序时出错