根据docs.microsoft.com , ASP.NET 核心实现了 Synchronizer Token Pattern 来缓解 CSRF。
反请求伪造机制有许多影响用户的缺点:
ex 1:登录页面在 2 个选项卡中打开
- 在两个不同的选项卡中打开登录页面
- 用户 A 从选项卡 1 记录(无问题)
- 在不刷新 Tab 2 的情况下,用户 B 尝试登录。
=> 产生一个带有 AntiforgeryValidationException 的 400 页
ex 2:在 2 个选项卡中打开的表单(来自邮件中的同一链接)
- 从模板创建一个新的 Asp.Net Core MVC 网站(VS 2019)
- 创建一个具有简单表单的新页面,该表单在发布时使用 [ValidateAntiForgeryToken] 进行验证。
- 通过电子邮件向自己发送指向该页面的链接(我使用过 Gmail 和 Mailtrap)
- 通过正常单击在两个选项卡中打开链接
- 以任意顺序提交两种表格
=> 首先打开的表单会产生 400 错误
看起来 SameSite=strict 是针对 CSRF 攻击的有效安全措施
根据这篇文章和这个 RFC 草案,SameSite cookie 似乎是针对 CSRF 攻击的有效且强大的安全措施。ASP.NET Core 2.2 的身份验证 cookie 配置为 SameSite=strict。如果我的理解是正确的,身份验证cookie只会在同站点导航的情况下发送到服务器。
在我的用例中,我信任子域。
因此,如果我可以保证我的用户使用的是支持 SameSite 策略的浏览器,那么禁用我的 ASP.NET Core 应用程序的反 CSRF 机制是否安全?