如何验证 CSRF 令牌?

Loa*_*... 0 csrf token hapijs

我正在尝试使用 Hapi 的插件Crumb来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案的流程。我可以简单地在每个 http 响应中设置一个令牌作为 cookie。问题来了,如果客户端发出令牌,REST 如何验证 CSRF 令牌?REST 后端如何理解此随机字符串对该请求有效而另一个随机字符串无效?

RB_*_*RB_ 6

无法在客户端生成 CSRF 令牌。它应该先从服务器发送到客户端,一些 JS 框架会自动从 cookie 中提取它并发送到服务器。

基本思想是,用户应该将令牌与 cookie 以及发布数据一起发送。这是一个简单的例子。如果攻击者会欺骗用户向服务发送特定请求,例如恶意网站可以拥有带有此链接的图像src="gmail.com/deleteaccount=true"。如果用户登录到 gmail。Gmail 会认为是用户发出了请求,因为与请求一起发送的 cookie 是有效的。因此,为了确保它实际上是一个用户,gmail 还需要一个带有请求数据的令牌发送:因此gmail.com/deleteaccount=true它不需要gmail.com/deleteaccount=true&token=987y23459827345sdfg.令牌必须匹配存储在 cookie 中的令牌。因此,当服务器收到请求时,它会检查 cookie 中的令牌是否等于请求正文中的令牌。攻击者无权访问用户的 cookie,也不知道令牌。这是简化的数据流:

在此处输入图片说明

更详细地说,它看起来像这样:

  • 1) 用户向服务器发送 GET 请求
  • 2)服务器用sessionid设置cookie,用token保存会话数据
  • 3) 服务器返回带有隐藏字段中包含令牌的表单的 HTML。
  • 4) 用户提交表单,以及一个隐藏字段
  • 5) 服务器将提交的表单(隐藏字段)中的令牌与会话存储中保存的令牌进行比较。如果它们匹配,则表示该表单是由用户提交的。

这是另一个很好的答案:为什么将 CSRF 预防令牌放在 cookie 中很常见?