如何在每个Spring JSON响应之前添加")]}',\n"以防止常见漏洞。

3
我希望在servlet生成的所有JSON响应中添加一个")]}',\n"前缀,以防止JSON漏洞,如AngularJS建议。 我找到了一种修改响应内容的方法。 使用Spring的OncePerRequestFilter基类,我最终得到了以下代码:
public class JsonArrayVulnerabilityPreventorFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        PrintWriter responseOut = response.getWriter();
        CharResponseWrapper responseWrapper = new CharResponseWrapper(response);
        filterChain.doFilter(request, responseWrapper);
        if (StringUtils.contains(responseWrapper.getHeader("Content-Type"), "application/json")) {
            responseOut.write(")]}',\n");
        }
        String originalServletResponse = responseWrapper.toString();
        responseOut.write(originalServletResponse);
    }
}

问题在于,当我引入响应包装器时,Content-Type头(以及其他一些头)从响应中消失了。我已经确认,没有包装器时,response.getHeaderNames()调用返回14个不同的头(包括内容类型),而使用包装器只有9个。它还会破坏字符编码,因为使用包装器时,Content-Type头不会告诉浏览器内容是UTF-8编码的。为什么?

CharResponseWrapper的来源和想法在这里在这里

public class CharResponseWrapper extends HttpServletResponseWrapper {
    private CharArrayWriter output;

    public String toString() {
        return output.toString();
    }

    public CharResponseWrapper(HttpServletResponse response) {
        super(response);
        output = new CharArrayWriter();
    }

    public PrintWriter getWriter() {
        return new PrintWriter(output);
    }
}
2个回答

5

使用Spring Boot时,只需拥有以下bean即可工作。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setJsonPrefix(")]}',\n");
    return converter;

}

这里是来自Spring Lemon项目的一个示例。


2

实际上,我通过以下配置解决了根本问题(将 )]}',\n 前缀添加到每个 JSON 响应)。

@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setJsonPrefix(")]}',\n");
        converters.add(converter);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接