csrf 攻击中为什么 token 能够防御?攻击者不是可以轻易拿到 token 吗?

关于 csrf 攻击中有两个疑问:

  1. csrf token 是不是指登录时后端返回的 token?有效期一般是多久?
  2. 为什么 token 能够防御攻击?token 不是可以轻易拿到吗? token 一般存在 cookie 中,攻击者不是可以读取 cookie 拿到 token 吗?就算 cookie 可以设置为不可读取,那浏览器F12,开发者工具中不是也能看到 cookie 中的 token 吗?攻击者直接拿这个 token 发送请求不是也可以吗?
阅读 2.7k
2 个回答

CSRF 的 CS 是跨站的意思。比如说,你在思否页面点击下面的链接,打开的是百度网站:
百度搜索:CSRF
从思否到百度,这就是一次跨站操作,而且你的搜索内容是被我所控制的。不过这里由于百度的搜索接口不会有任何敏感操作,所以不会有任何危害,但如果这是一个转账的链接,那么如果你登录了对应的网站,你点一下就会触发转账,攻击得逞。
你可能会认为没有网站会使用 get 方式来提交敏感操作,所以思否里面不可能发起更高级的攻击,因此 CSRF 漏洞只能恶搞一下什么的。但是对于攻击者而言,他可以自己做一个钓鱼网站,或者利用其他网站的 XSS 漏洞构造请求(不要怀疑,思否是有过 XSS 漏洞的,所幸似乎收到被大规模利用的记录)。

  1. CSRF token 是用来确保请求是从有 token 的页面中发起的,它的安全程度是可以分等级的,等级最高的自然是每一次渲染表单都生成专门的 CSRF token,次一点的每一次刷新页面生成 CSRF token,再次的一个用户长期使用同一个 CSRF token …… 最终底线是多个用户使用同一个 CSRF token,这会使得攻击者不接触受害者就拿到该 CSRF token;
  2. 我上面说的,不管是钓鱼网站也好、是其他网站 XSS 漏洞利用也罢——请求都是跨站的,因此使用页面层面的 API 是无法获取这个 CSRF token 的,你说的开发者工具什么的已经超出了页面层面的范围,开发者都能控制台运行了,何不把浏览器保存的密码一锅端了。
    CSRF token 不应该放在 cookie 里面,因为 CSRF 利用的就是请求会自带 cookies 的缺陷,虽然使用 cookie 下发 CSRF token 不会直接造成漏洞,但这距离使用 cookie 提交 CSRF token 也就差临门一脚了,CSRF 必须放在 cookie 之外的地方提交,否则就形同虚设了。

CSRF Token只是跨域站点伪造请求(CSRF)的一种解决办法,它防御不了cookie被盗的情况,一般位于源站下发的表单内<input type='hidden' id='csrf_token' value='xxxx'>

CSRF具体是什么?假设源站有一个这样的API:https://example.org/api?action=abc&foo=bar,攻击者伪造了一个站点 not-example.org 发送请求,一般浏览器的同源策略会阻止此次请求,但有些方式可以绕过同源策略,比如利用 <img src> 发送,而csrf token的作用就在于此,源站发送请求会携带下发的token,伪造的跨域站点则没有。

现在CSRF已经很少见了,因为大部分网站都流行RESTful API,这种callback式的api很少。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题