Skip to content

🛡️ CSRF (Cross Site Request Forgery) - 跨站请求伪造攻击

🤔 什么是 CSRF?

CSRF 是一种常见的网络安全漏洞,其本质是利用用户在目标站点的登录状态,在用户不知情的情况下执行未经授权的操作。

🎯 攻击原理

攻击者通过精心构造的陷阱,诱导已登录的用户执行非本意的操作:

  1. 正常登录阶段 🔑

    • 用户访问并登录合法网站
    • 网站向用户浏览器派发身份认证 cookie
    • cookie 会在后续请求中自动携带
  2. 攻击执行阶段 ⚔️

    • 用户在未退出登录的情况下访问恶意网站
    • 恶意网站通过各种手段(如图片链接、表单等)向目标站点发起请求
    • 浏览器自动携带目标站点的 cookie
    • 目标站点无法分辨请求是否是用户本意

这种攻击手法巧妙地绕过了同源策略的限制,因为请求是通过受害者的浏览器发起的,携带了合法的身份认证信息。

🛠️ CSRF 防御策略

Cookie 的 SameSite 属性提供了三种安全级别:

  • Strict (严格模式) 🔒

    • 完全禁止跨站请求携带 Cookie
    • 安全性最高,但可能影响正常的跨站功能
    • 适用于高安全要求的应用
  • Lax (宽松模式) 🔓

    • 允许部分安全跨站请求携带 Cookie
    • 支持的场景:
      • 页面超链接跳转
      • GET 表单提交
      • 预加载请求
    • 推荐的默认配置
  • None (无限制) ⚠️

    • 允许所有跨站请求携带 Cookie
    • 需要配合 Secure 属性使用
    • 安全性最低,不推荐使用

SameSite 特性需要现代浏览器支持,旧版本浏览器可能存在兼容性问题

2. 🔍 Referer/Origin 验证

服务端可以通过验证请求头中的来源信息来防御 CSRF:

  • Referer: 记录完整的来源页面 URL
  • Origin: 记录请求的源站信息

服务器通过校验这些头部信息,可以:

  • 确保请求来自合法的源站
  • 拦截可疑的跨站请求
  • 建立请求的可信任链路

3. 🎟️ Token 验证机制

实现基于 Token 的身份验证:

  • 每次请求都需要携带独特的 Token
    • 请求头: Authorization: Bearer <token>