之前在《编写高质量代码》中第一次看到 CSRF 这个东西,没能理解。最近刚好喵了 Session 和 Cookie 相关,又在查阅 XSS 的过程中看到 CSRF,于是简单整理一下

关于 CSRF

CSRF(Cross-site request forgery),即跨站请求伪造,也被称为 One Click Attack 或者 Session Riding。与 XSS 不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求,在受信任的网站做危险的事情

攻击方式

CSRF 示意

看图片应该很好理解了。要完成一次CSRF攻击,用户必须依次完成两个步骤

  1. 登录受信任网站 A,并在本地生成 Cookie
  2. 在不登出 A 的情况下,访问危险网站 B

B 有可能是一个纯粹的恶意网站,也有可能是受信任网站遭受 XSS 攻击。当 B 向 A 发送请求时,如果没有登出 A 站点,那么 B 发出的请求将携带 A 储存在浏览器的 cookie,被 A 当做信任的请求处理,由此产生极大的风险

防范方法

最简单有效的防范方法是在提交表单时增加一个伪随机数,提交之后服务器验证所提交的随机数是否与服务器保存的一致即可

然而这会带来一个问题是用户如果同时打开两个页面提交表单,比较慢打开的表单页面产生的伪随机数会覆盖之前产生的伪随机数,使先打开的表单页面无法提交。解决方法是为不同表单生成不同的伪随机数,这里就不展开了

参考链接

浅谈 CSRF 攻击方式