Skip to content

CSRF

Cross-Site request forgery,跨站请求伪造:攻击者诱导受害者进⼊恶意⽹站,在第三⽅⽹站中,向被攻击⽹站发送跨站请求。利⽤受 害者在被攻击⽹站已经获取的注册凭证,绕过后台的⽤户验证,达到冒充⽤户对被攻击的⽹站执⾏某项操作的⽬的。

攻击步骤:

  1. 受害者登录 a.com,并且保留了登录凭证 cookie
  2. 攻击者诱导受害者访问 b.com
  3. b.com 向 a.com 发送请求,a.com/xxxx,浏览器就会直接带上 a.com 的 cookie
  4. a.com 收到了请求,验证通过后,执行相应操作
  5. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了自己定义的操作

攻击类型

  • GET 型:如在⻚⾯的某个 img 中发起⼀个 get 请求

  • POST 型:通过⾃动提交表单到恶意⽹站

如何防范

CSRF 一般发生在第三方域名,攻击者无法获取到 cookie 信息,只是利用浏览器机制使用 cookie

  • 同源策略

    • 通过检查 request header 中的 origin、referer、host 等,判断请求站点是否是自己允许的站点。

      • host:任何请求携带,域名和端口号
      • origin:一般存在于跨域请求中,协议和域名,和 Access-Control-Allow-Origin 一起存在
      • referer:告知服务器原始 url,其用于所有类型的请求,并且包括:协议+域名+查询参数
    • Referrer-Policy:可设置携带 referer 头,eg:Referrer-Policy: no-referrer | same-origin 等。

  • Cookie SameSite

    • Strict:完全禁止第三方 cookie,⽐如 a.com 的⻚⾯中访问 b.com 的资源,那么 a.com 中的 cookie 不会被发送到 b.com 服务 器,只有从 b.com 的站点去请求 b.com 的资源,才会带上这些 Cookie
    • Lax:在跨站点的情况下,从第三⽅站点链接打开和从第三⽅站点提交 Get ⽅式的表单这两种⽅式都会携带 Cookie。但如果在第三 ⽅站点中使⽤ POST ⽅法或者通过 img、Iframe 等标签加载的 URL,这些场景都不会携带 Cookie
    • None:任何情况下都会发送 Cookie 数据
  • CSRF Token:提交请求时携带额外信息

    • 用户打开页面的时候,服务器生成一个 token
    • 每次页面加载的时候,加到所有的能发请求的 html 元素上, ⽐如 form, a
    • 每次前端发起请求, 都携带 Token 参数
    • 服务端每次接收请求, 都校验 Token 的有效性