一、CSRF 攻击是什么

image.png
CSRF 攻击全称 跨站请求伪造 (Cross-site request forgery),其核心思想在于,在打开A网站的情况下,另开Tab页面打开恶意网站B,此时在B页面的“唆使”下,浏览器发起一个对网站A的HTTP请求。这个过程的危害在于2点:

  • 这个http 请求不是用户主动意图,而是 B “唆使的”, 如果是一个危害较大的请求操作(如 发邮件、删数据等等)那就麻烦了
  • 因为之前 A 网站已经打开了, 浏览器存有 A 下发的 cookie 或其他用于身份认证的信息, 这一次被“唆使”的请求,将会自动带上这些信息, A 网站后端分不清楚这是否是用户真实的意愿

    二、如何防范CSRF的攻击呢?

    CSRF 一般都发生在第三方域名, 攻击者无法获取到 cookie 信息, 只是可以利用浏览器机制去适应 cookie
  1. 阻止第三方域名的访问
    1. Cookie SameSite:Cookie 的 SameSite 属性 - 阮一峰的网络日志
      1. Strict 最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie
      2. Lax 规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
      3. None Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
      4. 设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性
    2. 同源检测: 通过 request header 中的 origin referer 等, 来确定发送请求的站点是否是自己期望的站点
  2. 提交请求时附加额外信息
    1. CSRF Token
      1. 当用户打开页面时, 服务器利用加密算法给当前用户生成一个Token;
      2. 每次页面加载时,前端把获取的Token 加到所有能发送请求的html 元素上
      3. 服务端每次接受请求,都校验Token 的有效性
    2. 双重Cookie Token
      1. 用户访问网站的时候, 服务器向浏览器注入一个额外的Cookie,内容随便;
      2. 每次前端发起请求,都在请求上拼接csrfcookie 这个参数,参数值就从cookie里获取;
      3. 服务端接收到请求,就去校验请求参数里的值和cookie里的值是否一致

参考 【知识总结】有关前端安全的面试题总结 - 掘金 前端3年以上面试常考问的web安全问题总结 - 腾讯云开发者社区-腾讯云 Cookie 的 SameSite 属性 - 阮一峰的网络日志