过于宽松的 CORS 设置会导致 CSRF 吗?

Posted

技术标签:

【中文标题】过于宽松的 CORS 设置会导致 CSRF 吗?【英文标题】:Can overly permissive CORS settings lead to CSRF? 【发布时间】:2016-11-22 17:36:59 【问题描述】:

我觉得每当我看到有关 CORS 的文档时,都建议使用默认的 Access-Control-Allow-Origin: * 配置。在我看来,这是使您的 API 现在容易受到 CSRF 攻击的完美方式。解释是同源策略是阻止浏览器中的 XHR 请求使 API 端点完全易受 CSRF 攻击的唯一方法,而 CORS 本质上是绕过 SOP。

我的逻辑是否合理,任何具有过于宽松的 CORS 设置的网站本质上都会将其后端 API 暴露给 CSRF 攻击?如果是这样,那么无论何时提出 CORS,都应该明确提及这一点。

【问题讨论】:

【参考方案1】:

允许所有来源当然不是最佳实践,但这并不一定会让您受到 CSRF 的约束,除非您在传入请求中允许 cookie。要缓解 CSRF,您需要:

    验证来源。通常,您在代码或配置中定义白名单。如果传入源不在白名单中,则使用 403 状态代码拒绝请求。 通过令牌添加反 CSRF 支持。微软对它们在 ASP.NET MVC 和 Web API 中的使用有很好的article。基本上,令牌只是一个随机字符串,每次请求都会发生变化。

还可以考虑使用 cookie 以外的其他方式来验证请求/用户。例如,考虑使用通过 Authorization 标头提交的身份验证令牌。

我强烈推荐了解更多关于 CORS 和缓解 CSRF 的资源是 Monsur Hossain 的书 CORS In Action。作者还创建了一个很好的配套网站 (enable-cors.org),其中包含示例和其他资源的链接。

【讨论】:

以上是关于过于宽松的 CORS 设置会导致 CSRF 吗?的主要内容,如果未能解决你的问题,请参考以下文章

接口调用过于频繁会引发超时错误吗

CORS和CSRF修炼宝典

为啥预检 CORS 不阻止 CSRF 攻击?

无法在 Spring 中配置 CSRF 以免面临 CORS 错误

CSRF-CORS-JSONP

为啥 Selenium 会导致 CSRF 403?