如何验证CSRF令牌?

时间:2017-07-10 12:26:06

标签: token csrf hapijs csrf-protection

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

1 个答案:

答案 0 :(得分:2)

无法在客户端上生成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并且无法识别令牌。 这是简化的数据流:

enter image description here

更多细节看起来像这样:

  • 1)用户向服务器发送GET请求
  • 2)服务器设置cookie sessionid,并使用令牌
  • 保存会话数据
  • 3)服务器返回带有包含隐藏字段中的标记的表单的HTML。
  • 4)用户提交 表格,以及隐藏的字段
  • 5)服务器比较来自的令牌 使用保存在会话存储中的令牌提交表单(隐藏字段)。如果匹配,则表示用户提交表单。

这是另一个问题答案:Why is it common to put CSRF prevention tokens in cookies?