我想为 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
的来源和想法 here和 here .
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/