2017-07-10 206 views
0

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

回答

1

无法在客户端上生成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?

+0

这意味着当用户发表的帖子,随机生成的令牌的cookie立即保存,当它进入到服务器,服务器检查的cookie令牌和请求令牌相同或不。如果它是相同的,那么它会给出访问权限? @RB_ – WahidSherief

+0

@WahidSherif最简单的形式就是这样:1 - 在用户会话中保存一个令牌。 2 - 将包含相同标记的隐藏字段添加到要渲染的窗体。提交表单时,它包含CSRF令牌,因此您知道该表单是由用户提交的。 –

+0

例如,X是服务器,Y是用户。每次当Y向X发布一些东西时,就会生成一个令牌。当Y提交表单时,该令牌会保存在Y的会话中。令牌也作为服务器X的隐藏字段.X会检查会话令牌和Y的隐藏令牌。如果它们匹配,X允许输入。 ?? – WahidSherief