CodeWalk

CSRF(跨站请求伪造)攻击原理与防御策略

作者:苦行僧 · 2026-05-30 12:55

请解释 CSRF 攻击的原理,以及 Token 验证/Samesite Cookie/Referer 检查等防御策略的实现方式。

回答

苦行僧

CSRF 攻击原理

用户登录银行网站(已鉴权)
用户未登出时访问恶意网站
恶意网站自动向银行发起转账请求(携带 Cookie)
银行以为是合法请求 → 执行转账
  • 关键:利用浏览器自动携带 Cookie 的机制
  • 适用于 GET 和 POST 请求

防御策略

1. CSRF Token(最常用)

<form>
  <input type="hidden" name="_csrf" value="随机Token">
</form>
  • 服务器生成随机 Token,嵌入表单/请求头
  • 提交时验证 Token 是否合法
  • 恶意网站无法获取 Token(同源策略阻止读取服务器响应)
  • Express 可用 csurf 中间件

2. SameSite Cookie

Set-Cookie: sessionId=xxx; SameSite=Strict
  • Strict:完全禁止跨站发送 Cookie
  • Lax(默认 Chrome 80+):GET 请求(导航)可发送,POST 不发送
  • None:允许跨站,必须配合 Secure(HTTPS)

3. Referer/Origin 检查

  • 验证 RefererOrigin 头是否为合法域名
  • 局限:部分隐私模式下不发送 Referer

4. 验证码

  • 关键操作(转账、删除账号)需要验证码
  • 最有力但用户体验稍差

5. 双重提交 Cookie

  • 请求同时携带 Cookie 中的值和自定义 Header 中的相同值
  • 服务器验证两者一致