什么是 CSRF

CSRF(Cross-Site Request Forgery,跨站请求伪造)

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

关键点

  • 利用了用户的 身份认证状态(如 Cookie)。
  • 攻击者诱导用户点击链接或加载页面/图片,即可悄无声息发起请求。
  • 如果服务器没有做好防护,攻击请求将被认为是合法用户操作。

原因

  • 浏览器默认会携带 Cookie:即使页面是第三方站点。
  • 用户通常 不会频繁退出登录
  • 请求没有必要的验证机制(如 CSRF Token)。

CSRF 的攻击原理

设想一个网站 bank.com 有如下请求:

1
2
3
4
POST /transfer
Host: bank.com
Cookie: session=abc123
Body: to=attacker&amount=1000

攻击者构造一个页面如下:

1
<img src="http://bank.com/transfer?to=attacker&amount=1000" />

用户在登录 bank.com 后,没有退出登录,访问了攻击者网页,浏览器自动携带 bank.com 的 Cookie,服务器认为是合法请求,从而转账成功。


CSRF 的典型攻击方式

  1. GET 请求注入

    1
    <img src="http://target.com/delete?id=123" />
  2. 表单自动提交(POST):

    1
    2
    3
    4
    5
    6
    <form action="http://target.com/transfer" method="POST">
    <input type="hidden" name="to" value="attacker">
    <input type="hidden" name="amount" value="1000">
    <input type="submit">
    </form>
    <script>document.forms[0].submit();</script>

CSRF 与 XSS 的区别

方面 CSRF XSS
攻击者 第三方网站 插入恶意脚本到目标站点
原理 利用用户身份 利用浏览器执行恶意 JS
影响 未授权操作 数据泄露、身份盗用等
防御点 验证请求来源 过滤/转义用户输入

如何防御 CSRF?

  1. CSRF Token(推荐)

    • 每次表单/请求附加一个服务器生成的随机令牌。

    • 后端验证该 Token 是否匹配。

    • 示例:

      1
      <input type="hidden" name="csrf_token" value="random123" />
  2. SameSite Cookie 属性

    • 设置 Cookie 的 SameSite 为 StrictLax,防止第三方网站自动携带 Cookie。

    • 示例:

      1
      Set-Cookie: sessionid=xyz; SameSite=Strict
  3. Referer / Origin 检查

    • 检查请求头中 RefererOrigin 是否来自合法域名。
    • 缺点:Referer 可能被禁用,兼容性差。
  4. 双重 Cookie 验证(Double Submit Cookie)

    • 在 Cookie 和请求体中分别携带同一个 Token,服务端验证二者一致。
  5. 用户行为验证

    • 添加验证码(CAPTCHA)、点击确认弹窗等方式,增加用户操作成本。

参考

前端安全系列(二):如何防止CSRF攻击? - 美团技术团队