什么是CSRF攻击?如何防御?

1. 什么是 CSRF

2. CSRF 原理

3. CSRF 防御

答:

CSRF(Cross-site request forgery)跨站请求伪造。

你可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:

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

如果网站 A 允许使用 GET 方式请求更新资源,那么在用户登录网站 A 后,B 可以通过 <img> 以 GET 的方式请求第三方资源(指 A),所以你的浏览器会带上你的 A 的 Cookie 发出 Get 请求。

CSRF 攻击是源于 WEB 的隐式身份验证机制!WEB 的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

CSRF 攻击有以下几个关键点。

在服务端进行 CSRF 防御

目标网站 A 和恶意网站 B 发出的请求中,请求头唯一的不同就是 Referer 字段。通常来说,Referer 字段通常与 Host 字段的域名是一样的。根据 Referer 字段与 Host 字段在同一域名下的规则,可以检测 Referer 字段值,如果发现其与 Host 值不在同一域名下,这时候服务器就能够识别出恶意的访问了。

如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行 CSRF 攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个随机数。即 <input type="hidden" name="_csrf_token" value="xxxx"> 的形式。

当客户端通过表单提交请求时,这个随机数也一并提交上去以供校验。

补充

补充:CSRF 的本质是"借你的 Cookie 干坏事",防御的核心是让攻击者拿不到或用不了那个用于校验的凭据。

三种主流防御手段

  1. SameSite Cookie:把 Set-Cookie 加上 SameSite=Lax 或 Strict,跨站请求不再自动带上 Cookie

    Set-Cookie: sid=xxx; SameSite=Lax; Secure; HttpOnly
    
  2. CSRF Token:服务端下发随机 token,前端在请求里带上,攻击者无法预知

    <form>
      <input type="hidden" name="_csrf_token" value="随机字符串">
    </form>
    
  3. 校验 Referer / Origin:合法请求的 Referer 一定来自本站

实践建议

  • 现代浏览器 + HTTPS 环境下,SameSite=Lax 已经能挡住绝大多数 CSRF
  • 涉及转账、改密等敏感操作,必须再叠一层 token 校验
  • 不要用 GET 请求做"写"操作(GET 应该是幂等的)

来源整理自:我的有道云笔记