首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每个Spring响应前添加“)]},\n以防止常见的漏洞

如何在每个Spring响应前添加“)]},\n以防止常见的漏洞
EN

Stack Overflow用户
提问于 2014-10-15 14:20:31
回答 2查看 1.9K关注 0票数 3

我希望在servlet生成的所有JSON响应中添加一个")]}',\n"前缀,以防止JSON漏洞成为AngularJS建议。我找到了一个修改响应内容的方法。使用Spring中的OncePerRequestFilter基类,我最终得到了:

代码语言:javascript
复制
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 这里这里的来源和思想。

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-03 22:19:15

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

代码语言:javascript
复制
@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setJsonPrefix(")]}',\n");
        converters.add(converter);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-07-31 03:31:44

在使用Spring Boot时,只需像下面这样的bean就可以了。

代码语言:javascript
复制
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {

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

}

这里春柠檬项目的一个例子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26384930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档