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

标签 java spring servlets servlet-filters

我想为 servlet 生成的所有 JSON 响应添加一个 ")]}',\n" 前缀,以防止 JSON 漏洞 AngularJS suggests .我找到了一个 way to modify the response content .使用 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 header (以及其他一些 header )从响应中消失了。我已经确认,如果没有包装器,response.getHeaderNames() 调用会返回 14 个不同的 header (包括内容类型),而使用包装器时,只有 9 个。它还会破坏字符编码,因为使用包装 Content-Type header 不会告诉浏览器内容是 UTF-8 格式的。为什么?


CharResponseWrapper 的来源和想法 herehere .

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);
    }
}

最佳答案

使用 Spring Boot 时,只要有一个如下所示的 bean 也可以。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {

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

}

Here是来自 Spring Lemon 的示例项目。

关于java - 如何在每个 Spring JSON 响应之前添加 ")]}' ,\n"以防止常见漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384930/

相关文章:

java - 从 Android Studio 中的 fragment 更改整个应用程序主题

java - 将图形添加到 JFrame

java - 使用spring从服务层启动新线程的正确方法

jsp - java.lang.LinkageError : javax. servlet.jsp.JspApplicationContext.getExpressionFactory 错误

c++ - 从 C++ 代码与 servlet 交互

java - HttpSession 属性 : Why is the attribute not updated

java - Android 如何将 JSON 对象作为 url 参数传递

java - @formula 注释或 sql 解密函数的替代方案

java - 从4.3.11.Final版本切换到5.0.1.Final导致编译报错

java - 将多个 Shiro Realm 集成到 Spring Boot 环境 Java