是什么

Cross Site Request Forgery:跨站请求伪造攻击。
攻击者通过用户的浏览器发起请求,请求的服务无法如果无法识别是伪造的,就会识别为用户正常操作,从而导致攻击者可以操作用户的数据,被用于盗号、转账、发送虚假消息等。导致隐私泄露和财产安全。

攻击过程

  1. 用户浏览并登录受信网站,如taobao.com等。
  2. taobao.com验证通过并给该用户的浏览器设置特定的cookie,用于登录态的保持。而这个cookie一般只会在两种情况下失效:
    1. 被动失效:超时,这个时间要看服务端或浏览器的配置,一般是24小时甚至更长。
    2. 主动失效:一般网站都会提供退出登录功能,该功能的实现其实也是将cookie的失效时间设置为0。
  3. 一般用户浏览完taobao.com是不会主动登出的,甚至有可能浏览器都不关闭,那在这种场景下,访问了一个危险网站,这个危险网站有可能专门开发的恶意脚本,也有可能是被hack后植入恶意脚本,该脚本会发起对taobao.com的请求(请求接口的功能取决于攻击者的设定),由于浏览器会自动识别同域名下cookie并发送,那么此时的效果就会是用户的cookie+攻击者的请求,可以说你的身体成了被操纵的傀儡从而攻击者达到相应的目的。

    防御策略

    随机token验证

    上述场景有这么一个事实:攻击者只是利用了浏览器的cookie下发,但其并不知道cookie的实际内容,而受信网站内部是可以知道cookie的实际内容的,所以基于这个区别,服务端就可以设计一些方案来区别受信网站内发起的请求和攻击请求。
    随机token:也就是在cookie内置一个随机字符串,受信网站发起的请求都带上这个字符串(不管是get还是post请求都可以通过query-string方式带上),而如上所述攻击者是无法伪造这个token的,所以后端可以通过比较这两个字符串是否一致来拦截非内部请求。

    请求头Referer验证

    http请求头有一个referer字段,用于描述请求的来源网站,也就是如果来自于受信网站的请求referer就会显示受信网站的地址,来自于危险网站就会显示危险网站的地址。
    后端可以通过对referer字段的判断,是否属于受信网站(全匹配或二级域名匹配),来拦截攻击请求。

    前后端分离,即纯ajax请求

    同源策略就是说只有协议、主机号、端口的都一样的域才能进行请求,而这样做的目的就是为了安全,防止网站信息被窃取。所以由于同源策略,ajax请求是无法向非当前网站发送请求的。
    image.png