它应该首先从服务器发送到客户端,一些JS框架会自动从cookie中提取出来并发送到服务器。
其基本思想是,用户应该将令牌与cookie以及post数据一起发送。这里有一个简单的例子。如果攻击者诱骗用户向服务发送特定请求,例如,恶意网站可以具有带有此链接的图像
src="gmail.com/deleteaccount=true"
。如果用户登录到gmail。Gmail会认为是用户发出了请求,因为cookie和请求一起发送是有效的。因此,为了确保它实际上是一个用户,gmail还需要一个令牌发送和请求数据:所以,而不是
gmail.com/deleteaccount=true
它需要
gmail.com/deleteaccount=true&token=987y23459827345sdfg.
令牌必须与存储在cookie中的令牌匹配。因此,当服务器收到请求时,它会检查cookie中的令牌是否等于请求正文中的令牌。攻击者无法访问用户的Cookie,也不知道令牌。
以下是简化的数据流:
在更多细节中,它看起来像这样:
-
1) 用户向服务器发送GET请求
-
sessionid,并使用令牌保存会话数据
-
3) 服务器返回HTML,表单包含隐藏字段中的令牌。
-
-
5) 服务器比较来自
已提交表单(隐藏字段),令牌保存在会话存储器中。如果匹配,则表示表单由用户提交。
Why is it common to put CSRF prevention tokens in cookies?