我看过关于网络安全的 Pluralsight 课程,其中指出为了减轻 CSRF 攻击,网站应该向客户端返回两个“配对”的 CSRF 令牌,一个在隐藏的表单字段中,另一个在 cookie 中,它们与用户的会话。每当用户访问带有例如表单的页面时都会发布这些令牌。
现在,由于攻击者的网站无法获取隐藏的表单字段令牌(同源策略),它无法向包含表单的页面发出有效请求。
但是为什么需要两个 CSRF 令牌来防止 CSRF?表单字段令牌本身还不够吗?
我看过关于网络安全的 Pluralsight 课程,其中指出为了减轻 CSRF 攻击,网站应该向客户端返回两个“配对”的 CSRF 令牌,一个在隐藏的表单字段中,另一个在 cookie 中,它们与用户的会话。每当用户访问带有例如表单的页面时都会发布这些令牌。
现在,由于攻击者的网站无法获取隐藏的表单字段令牌(同源策略),它无法向包含表单的页面发出有效请求。
但是为什么需要两个 CSRF 令牌来防止 CSRF?表单字段令牌本身还不够吗?
您所描述的模式称为“双重提交 cookie”,它是防御 CSRF 的常用方法。这里的重点是它不需要服务器记住令牌。客户端以 cookie 和其他方式(例如在表单字段中)发送令牌。服务器检查两个令牌是否相同。
这是有效的,因为攻击者无法读取或写入 cookie,因此无法在表单字段中复制它。这就是为什么它必须发送两次:
还有其他针对 CSRF 的防御措施,它们只使用一个令牌。最常见的是将正确的值存储在服务器上的会话变量中,并检查表单字段是否匹配。不需要 cookie。但是,这样做的缺点是服务器必须维护每个用户的状态。
一个令牌就足够了,只要它是隐藏的表单字段,并且是每个请求的(这意味着您在每个响应中都会收到一个令牌,以便在下一个请求中发送)。请注意,令牌不应存储在 cookie 中,因为 cookie 是自动发送的。
有不同的做事方式(有些是特定于框架的)。两个令牌过程也是解决 CSRF 问题的好方法。cookie 和页面上的令牌是加密链接的。因此,如果一切正常,服务器必须执行此检查并继续处理此请求。
为了防止 CSRF 攻击,CSRF 令牌必须与预期令牌匹配。
网站需要存储预期的令牌,而一种常见的方法是设置 cookie。
如果两个标记都匹配,则表单有效。