CSRF 攻击是什么?如何防范?
简化版
CSRF 是攻击者诱导已登录用户在不知情时向目标网站发起请求,利用浏览器自动携带 Cookie 的特性完成伪造操作。防护方式包括 SameSite Cookie、CSRF Token、校验 Origin/Referer、重要操作二次确认,以及避免用 GET 做状态修改。
详细版
CSRF 成立通常需要:
- 用户已登录目标站点。
- 登录态保存在 Cookie 中。
- 浏览器跨站请求会自动带上 Cookie。
- 目标接口只依赖 Cookie 判断身份。
- 攻击者能构造状态修改请求。
防护方式:
- Cookie 设置
SameSite=Lax或Strict。 - 修改类请求带 CSRF Token。
- 服务端校验 Origin 或 Referer。
- 关键操作加验证码或二次确认。
- GET 请求只用于读取,不用于修改。
CSRF 主要防的是“请求被伪造”,不是“响应被读取”。
完整版教学
一、CSRF 的攻击过程
用户登录了 A 网站,浏览器保存了 A 的 Cookie。用户又访问恶意 B 网站,B 网站中放了一个自动提交表单或图片请求,指向 A 网站的转账接口。
如果 A 网站只看 Cookie 判断用户身份,浏览器会自动带上 Cookie,A 可能误以为这是用户本人操作。
二、为什么 Cookie 是关键
CSRF 依赖浏览器自动携带凭证。如果登录态是前端手动放到 Authorization header,普通跨站表单或图片请求通常无法自动带上这个 header,CSRF 风险会降低。
但这不代表 token 方案没有安全问题。token 如果被 XSS 窃取,同样危险。
三、CSRF Token
CSRF Token 的思路是让请求必须携带攻击者拿不到的随机值。
页面加载时服务端下发 token,修改类请求必须带上 token。攻击者虽然能诱导浏览器发请求,但通常读不到目标站页面里的 token。
服务端验证 token 正确才执行操作。
四、面试追问与工程落地
面试官可能问:“SameSite 能完全替代 CSRF Token 吗?”
不能一概而论。SameSite 能显著降低跨站携带 Cookie 的风险,但兼容性、业务跨站场景和安全等级不同。高风险系统通常会组合 SameSite、Token、Origin 校验。
工程中所有状态修改接口都应该使用 POST/PUT/DELETE,并在服务端做权限和来源校验。
五、SameSite、Token 与来源校验如何组合
SameSite 判断的是 site,不等同于严格的 origin;同站不同子域仍可能是不同源。高风险 Cookie 会话通常采用多层策略:
| 防线 | 能解决什么 | 主要边界 |
|---|---|---|
SameSite=Lax/Strict | 减少跨站自动带 Cookie | 同站攻击、业务跨站流程需另评估 |
| 同步 Token | 证明页面拿到服务器秘密 | XSS 可能窃取或代发 |
| Origin/Referer 校验 | 验证请求来源 | 缺失策略和代理配置要明确 |
| Fetch Metadata | 识别跨站请求上下文 | 需兼容不发送相关头的客户端 |
| 二次确认 | 降低高危误操作 | 不能替代接口层校验 |
Token 要有足够熵、绑定会话,并通过隐藏字段或自定义头返回;不要放进 URL,避免进入历史、日志和 Referer。服务端必须使用恒定时间比较并在缺失或不匹配时拒绝。
记忆钩子:CSRF 防的是“浏览器替攻击者带凭证”,所以服务端要额外验证一项攻击页面无法伪造的请求上下文。
六、用转账请求推演防线
假设用户登录银行后访问恶意页,恶意页自动提交:
<form action="https://bank.example/transfer" method="post">
<input name="to" value="attacker">
<input name="amount" value="10000">
</form>
POST 并不会自动安全。若会话 Cookie 可跨站携带且接口只校验 Cookie,10000 元状态变更仍可能执行。加入会话绑定的 256 位随机 Token 后,攻击页能提交表单却无法猜中 Token;再配合 SameSite 和 Origin 校验,单点配置失误也不至于直接失守。
接口还应采用幂等键和交易确认,防止用户双击、网络重试与攻击流量造成重复执行。安全测试至少覆盖跨站表单、跨站图片 GET、缺 Token、错误 Token、合法同源请求和 XSS 场景;XSS 能以站内脚本身份发请求,因此必须独立修复。
对于多标签页和后退操作,按请求轮换 Token 可能造成可用性问题;按会话 Token 更易用但暴露窗口更长。选型要同时考虑安全等级、并发请求和表单历史行为。
七、常见误区与追问
- 误区:把状态修改接口改成 POST 就能防 CSRF。 攻击者可以构造跨站表单提交 POST。
- 误区:SameSite 可以在所有业务中完全替代 Token。 同站子域、兼容性和合法跨站流程会留下边界,高风险系统应组合防线。
- 误区:CORS 能阻止所有 CSRF 请求到达。 简单请求可能直接发送,CORS 主要决定响应能否被脚本读取。
- 追问:Token 为什么不能放 URL? 它可能泄漏到历史、日志、监控和 Referer 中。
- 追问:Authorization 头为何通常降低传统 CSRF 风险? 跨站表单不会自动添加该头,但 XSS 和错误 CORS 仍可能利用它。
- 追问:Origin 与 Referer 校验谁优先? 优先检查 Origin,缺失时按明确策略回退 Referer,不能默认放行所有缺失情况。
- 追问:XSS 为什么能绕过 CSRF 防护? 站内恶意脚本通常能读 Token 或调用自动加 Token 的请求层。
八、加强记忆
- 成立条件:用户有 Cookie 登录态,攻击者可构造请求,服务端缺少额外校验。
- 方法无关:POST 也能被表单提交,GET 更不应修改状态。
- 核心凭据:Token 必须随机、保密、绑定会话且不进 URL。
- 浏览器防线:SameSite、Origin/Referer、Fetch Metadata 共同缩小跨站入口。
- 业务防线:高危操作二次确认、幂等和审计限制损失。
- 相互影响:XSS 可能击穿 CSRF 防线,两类漏洞必须分别治理。