【发布时间】:2017-01-10 17:20:16
【问题描述】:
我正在开发 Web 应用程序,并要求在发布前针对它运行 VAPT。
然后我下载了Vega并快速扫描了我的webapp,发现了一个VAPT问题,如下:
Vega 检测到资源设置了不安全的跨域 资源共享 (CORS) 访问控制。 CORS 提供的机制 允许服务器限制跨站点请求的资源访问 某些受信任的域。有问题的服务器已允许资源 通过设置的值从任何来源 通配符值的“Access-Control-Allow-Origin”响应标头。 这会带来安全风险,因为任何站点都可以向 访问资源,无论来源。
然后我开始寻找解决方案并遇到this 帖子并按照答案中的建议实施了filter,如下所示:
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(request, response);
}
public void destroy() {
}
}
现在,当我再次针对 webapp 扫描 Vega 时,它没有再次列出相同的问题,我相信这使我的 webapp 免受CSRF 攻击。
现在,在阅读了this 的帖子后,我正在思考request.getHeader("Origin") 如何防止Cross Site Request Forgery attacks,因为无论来源是https://webapp.com 还是https://evil.com,请求始终对我的应用程序有效从请求标头本身中选择"Access-Control-Allow-Origin"。
谁能帮我理解这个概念,设置request.getHeader("Origin")如何从CSRF attacks保存?
谢谢。
阅读@rism 答案和 Patrick Grimard post 后了解:
当客户端应用程序发出 AJAX 请求时,浏览器最初会向服务器发送预检 OPTIONS 请求以确定允许客户端执行的操作,而不是 GET,这就是我们应该设置 @987654340 的原因@ 作为响应标头的一部分的源或特定域。
以POST为例,当客户端发送请求时,浏览器首先向服务器发出预检OPTIONS请求,服务器对OPTIONS请求的响应包含指示浏览器的所有origin请求的标头是允许的。除了添加response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); 站点仍然容易受到攻击,因此我们需要在 Apache(对于部署在集群中的应用程序)中明确地whitelist IP 的完成,如 here 或在 Tomcat 中描述的 here。
我还有一个疑问,如果我们在服务器级别限制 IP 地址,是否真的需要将 "Access-Control-Allow-Origin" 设置为响应标头的一部分?
【问题讨论】:
-
如果您使用的是最新版本的 spring security 内置的 cors 支持,您不必编写过滤器
-
是的,您仍然需要发送 ACAO 标头,因为尽管 IP 限制可能会限制可接受的绑定 IP 范围,但请求仍可能是跨源的。因此,尽管 IP 限制可能充当白名单,但如果没有 ACAO 标头,您仍然无法执行 CORS。即使是从 a.example.com 到 b.example.com 的请求也是跨域的,如果使用 AJAX,则需要 CORS 标头。
-
明确地说,CORS 实际上是 HTML5 规范的客户端技术部分。所以我假设你在谈论来自客户端浏览器的 AJAX 请求?否则,如果您实际上是在谈论服务器到服务器的调用,那么 CORS 根本不相关,因为它是执行同源策略的浏览器,而不是服务器。
-
@rism:我只关心来自客户端浏览器的 AJAX 请求,也感谢您消除疑问!
标签: security spring-security cross-domain csrf