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

解释了 CSRF 攻击的原理及其防御方法,如使用 CSRF Token 和 SameSite Cookie 属性。

前端安全 中等 安全 CSRF 跨站请求伪造

CSRF(跨站请求伪造,Cross-Site Request Forgery)是一种网络安全攻击方式。其核心是攻击者利用用户在已验证网站上的身份认证信息(如会话 Cookie),诱导用户访问恶意页面或链接时非预期地发起请求到原网站。攻击者利用浏览器对该网站已缓存的认证信息自动发送而通过服务器验证,导致执行转账或修改数据等恶意操作。 完整攻击流程包括:

  1. 用户登录受信任网站A(获得会话 Cookie)。
  2. 用户访问恶意网站B。
  3. B页面向网站A发起伪造请求(如转账表单),浏览器自动添加用户认证信息。
  4. 网站A服务器执行操作,误以为是合法操作而篡改用户数据。

典型防御策略如下:

  1. CSRF Token:
    • 服务端生成唯一的 token 值存储在用户会话和表单中(如隐藏字段)。
    • 每次用户提交时,服务端验证 token 是否匹配。示例代码:
      # Flask + CSRFProtect 示例
      from flask_wtf.csrf import CSRFProtect
      app = Flask(__name__)
      CSRFProtect(app)  # 自动生成 token 并验证
      
  2. SameSite Cookie 属性:
    • 设置敏感 Cookie 的 SameSite 属性为 StrictLax(默认),可限制跨域请求携带 Cookie;
      • Strict: 禁止所有跨站 Cookie 发送;
      • Lax: 允许导航级 GET 请求携带 Cookie,屏蔽 POST。设置方法:
        Set-Cookie: session=secret-value; SameSite=Strict; Secure; HttpOnly
        
  3. 验证 Referer/Origin 头部:
    • 服务端检查请求头中的 RefererOrigin 字段,确认是否来自可信域名源。Flask示例:
      if request.headers.get('Referer', '').startswith('https://yourdomain'):
          proceed_request()  # 只允许信任来源
      else:
          abort(403)   # 拒绝请求
      
  4. 关键操作添加验证码:
    • 在敏感操作(如付款、改密)处要求用户二次输入验证码确认身份。

综合策略还包括 HTTPS 协议强制 Cookie 传输安全(Secure 标签),以及 HTTP 自定义头加强控制(如 JS 禁用时限制交互)。开发者应优先实现自动化 token 机制并结合其他手段提升网站安全防护。