【发布时间】:2017-12-14 04:28:04
【问题描述】:
我正在尝试使用 Hapi 的插件 Crumb 来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案流程。 我可以简单地将每个 http 响应中的令牌设置为 cookie。问题来了,如果令牌是由客户端发出的,REST 如何验证 CSRF 令牌? REST 后端如何理解这个随机字符串对这个请求有效而另一个随机字符串不是?
【问题讨论】:
我正在尝试使用 Hapi 的插件 Crumb 来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案流程。 我可以简单地将每个 http 响应中的令牌设置为 cookie。问题来了,如果令牌是由客户端发出的,REST 如何验证 CSRF 令牌? REST 后端如何理解这个随机字符串对这个请求有效而另一个随机字符串不是?
【问题讨论】:
不能在客户端生成CSRF token。应该先从服务端发送到客户端,有的JS框架会自动从cookie中提取出来发送给服务端。 p>
基本思想是用户应该发送令牌连同 cookie 以及发布数据。这是一个简单的例子。如果攻击者会欺骗用户向服务发送特定请求,例如恶意网站可以拥有带有此链接src="gmail.com/deleteaccount=true" 的图像。如果用户登录到 gmail。 Gmail 会认为是用户发出了请求,因为随请求一起发送的 cookie 是有效的。因此,为了确保它实际上是一个用户,gmail 还需要一个带有请求数据的令牌发送:所以不是gmail.com/deleteaccount=true 它需要gmail.com/deleteaccount=true&token=987y23459827345sdfg. 令牌必须匹配存储在 cookie 中的那个。因此,当服务器接收到请求时,它会检查 cookie 中的令牌是否等于请求正文中的令牌。攻击者无权访问用户的 cookie,也不知道令牌。
这是简化的数据流:
更详细地说,它看起来像这样:
这是另一个很好的答案:Why is it common to put CSRF prevention tokens in cookies?
【讨论】: