过于宽松的 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章