关于 CSRF 攻击验证 token 的疑问

我在 SegmentFault 上提了一个问题:

防御 CSRF 攻击,可以在表单页面的表单中生成一个 token,写在隐藏域中,同时保存在 session,使用 POST 方式,服务器端验证 token,如下这种攻击方式为什么不可以?

在中间网站我请求两次,第一次通过 GET 方式请求这个表单页面从而获取 token,第二次带上这个 token 发起 POST 请求,这样不就成功伪装了吗?我这个想法应该有问题,但好像又可以,错在哪?

但是网友的回答都不满意,后来自己回答了一下。

应该是这样的:

首先,我说的第一步通过中间页用 GET 方法请求表单页面,获取到 token,这个没问题,第二步,把获取到的 token 用于动态构造的表单中发送 POST 请求,这个也可以实现,但是第二步请求 token 验证不会成功。

关键在于 session 机制,通过中间页去请求服务器页面,生成 token 并放在 session 中,这个 token 只对中间页 sessionid 标识有效,因为这个请求是中间页发起的,而不是用户 cookie 中的 sessionid,所以服务器在验证 token 的时候会发现不一致,用户 sessionid 对应的 token 的值,跟中间页 GET 请求页面生成的 token 值不一致。

https://segmentfault.com/q/1010000012299408

打赏