https://segmentfault.com/q/1010000010357830

1.上面这段话中,跨站伪造请求最开始窃取了目标网站的cookie发送了请求,那么如果我们将token放在了cookie中,不还是被窃取到了,到服务器的时候也是一样的拿到cookie中的token然后通过了认证么?

你的应用用到了 cookie,那么后台验证就不能仅仅依赖 cookie,所以要额外加一个不通过 cookie 携带的验证参数,就是你题中说的 token 了。 至于这个 Token 怎么发送到前台就是另一个问题了:

提交表单时,token一般会作为表单的一个隐藏域被提交,类似,提交到服务器之后,服务器再校验表单提交的token和cookie中的token是否一致,一致则校验通过,不一致则很可能是CSRF攻击者的伪造请求。CSRF的确可以把Cookie提交到服务器,但是伪造不了表单的token,因为他拿不到Cookie的内容,那就通过不了校验。


又找了很多资料,准确来说,在很多场景中,token主要是为了用来实现跨域单点登录,单就实现这个功能来说,token放在cookie中或者post数据或者其他http请求头参数中都是可以的。但是,如果要防止CSRF,就不能将token放在cookie中。CSRF本质上是恶意页面利用了浏览器中正常页面的cookie,如果token存储在cookie中,点击恶意页面时,token就会在cookie中一起被提交到后端,后端对其验证是可以通过的。但如果存储在post数据或者其他http请求头参数中,在点击恶意页面时,由于正常页面post数据或者其他http请求头参数不会随着恶意页面而被提交到后端,恶意页面中也就没有token,后端就不会通过恶意页面的验证,再加上token的随机性,攻击者也无法在恶意页面中构造一个合法的token,从而防止CSRF。