为什么需要两个 CSRF 令牌(隐藏字段和 cookie)来缓解 CSRF 攻击?

信息安全 Web应用程序 csrf
2021-08-14 04:46:09

我看过关于网络安全的 Pluralsight 课程,其中指出为了减轻 CSRF 攻击,网站应该向客户端返回两个“配对”的 CSRF 令牌,一个在隐藏的表单字段中,另一个在 cookie 中,它们与用户的会话。每当用户访问带有例如表单的页面时都会发布这些令牌。

现在,由于攻击者的网站无法获取隐藏的表单字段令牌(同源策略),它无法向包含表单的页面发出有效请求。

但是为什么需要两个 CSRF 令牌来防止 CSRF?表单字段令牌本身还不够吗?

3个回答

您所描述的模式称为“双重提交 cookie”,它是防御 CSRF 的常用方法。这里的重点是它不需要服务器记住令牌。客户端以 cookie 和其他方式(例如在表单字段中)发送令牌。服务器检查两个令牌是否相同。

这是有效的,因为攻击者无法读取或写入 cookie,因此无法在表单字段中复制它。这就是为什么它必须发送两次:

  • 如果只有一个 cookie,它将在每个请求时自动发送,并且根本不提供任何保护。
  • 如果只有一个表单字段,就没有什么可比较的了,攻击者可以输入任何值。

还有其他针对 CSRF 的防御措施,它们只使用一个令牌。最常见的是将正确的值存储在服务器上的会话变量中,并检查表单字段是否匹配。不需要 cookie。但是,这样做的缺点是服务器必须维护每个用户的状态。

一个令牌就足够了,只要它是隐藏的表单字段,并且是每个请求的(这意味着您在每个响应中都会收到一个令牌,以便在下一个请求中发送)。请注意,令牌不应存储在 cookie 中,因为 cookie 是自动发送的。

有不同的做事方式(有些是特定于框架的)。两个令牌过程也是解决 CSRF 问题的好方法。cookie 和页面上的令牌是加密链接的。因此,如果一切正常,服务器必须执行此检查并继续处理此请求。

为了防止 CSRF 攻击,CSRF 令牌必须与预期令牌匹配。

网站需要存储预期的令牌,而一种常见的方法是设置 cookie。

如果两个标记都匹配,则表单有效。