CSRF漏洞的防御加固实战指南(附问答)
目录导读
什么是CSRF漏洞?攻击原理与核心危害
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户已认证身份,在用户不知情的情况下发起恶意请求的攻击方式,攻击者通过构造诱导链接、表单或图片请求,让受害者浏览器自动向目标网站发送携带认证信息(如Cookie)的请求,从而执行转账、改密、发帖等操作。

核心危害:
- 绕过权限验证,直接执行敏感操作
- 可能导致资金损失、数据泄露、账号被控
- 影响范围广,尤其对缺乏Token校验的Web应用
CSRF攻击的典型场景与触发条件
场景示例
- 论坛未加Token:用户登录论坛后,访问恶意页面,页面自动提交“删除所有帖子”的表单。
- 银行转账:用户保持网银登录状态,访问第三方站点,该站点自动发起转账请求。
- 修改密码:利用已登录的会话,自动提交密码修改表单。
触发条件
- 目标网站未使用CSRF Token
- 不校验Referer/Origin头
- Cookie未设置SameSite属性
- 请求完全符合同源策略(仅同站发起,但跨站伪造)
防御加固的六大核心策略
1 令牌同步模式(CSRF Token)
原理:服务器为每个用户会话生成唯一Token,嵌入表单或请求头,每次提交时校验。
加固要点:
- Token必须每次请求刷新,且与服务端存储一致
- 使用随机数生成器,保证不可预测
- 推荐注入为隐藏字段
<input type="hidden" name="csrf_token" value="xxx"> - 避免Token在URL中暴露(可通过Referer泄露)
- 建议Token与用户Session绑定,定期失效
2 同源检测(Origin/Referer校验)
原理:校验请求头中的 Origin 或 Referer 字段是否是合法来源。
加固要点:
- 优先使用
Origin(更可靠,但浏览器支持度略低) - 业务白名单:只允许固定域名或子域名发起请求
- 注意:Referer可被浏览器策略屏蔽或伪造,需结合Token使用
3 双重Cookie验证法
原理:将Token存放在Cookie中(如 csrf_token),并在请求参数/头中携带同一值,后端校验两者是否匹配。
加固要点:
- Cookie需设置
HttpOnly、Secure、SameSite - Token值与Cookie校验时,使用加密哈希防止暴力
- 适用于需要向后端传递Token但无状态接口的场景
4 自定义请求头防御
原理:要求所有敏感请求必须携带自定义头(如 X-CSRF-TOKEN),浏览器环境无法通过跨站表单带来自定义头。
加固要点:
- 适用于AJAX/SPA前端,需配合CORS设置
- 服务端对每个请求校验自定义头的合法性
- 避免单纯依靠
X-Requested-With(可被伪造)
5 SameSite Cookie属性设置
原理:Cookie设置 SameSite 可限制跨站请求时是否携带Cookie。
三种模式:
Strict:完全禁止跨站携带,安全性最高,但影响部分第三方登录流程Lax(默认推荐):允许部分GET请求(如导航)携带,POST等敏感操作禁止None:不安全,必须同时设置Secure,不推荐
加固要点:- 优先使用
SameSite=Lax配合其他验证 - 注意:现代浏览器已默认
Lax,但仍需手动声明兼容旧版
6 关键操作二次验证
原理:对转账、删除、改密等高危操作,要求用户额外输入密码、验证码或扫码。
加固要点:
- 适用于金融、管理后台等场景
- 验证通过后,会话内临时标记“可信操作”
- 避免频繁验证影响用户体验,可结合行为分析降频
不同架构下的加固方案对比
| 架构类型 | 推荐组合方案 | 注意事项 |
|---|---|---|
| 传统多页应用(MPA) | CSRF Token + Referer校验 + 关键操作验证 | Token需嵌入表单,每个请求独立 |
| 单页应用(SPA) | 自定义请求头 + SameSite Cookie + Token | 前端需管理Token获取与同步 |
| RESTful API | Token(JWT)+ Origin校验 + 请求头 | 避免Cookie方案,使用Authorization头 |
| 微服务/分布式 | 全局网关统一校验Token + 同源检测 | Token需中心化存储,防止服务间伪造 |
常见问答(FAQ)
Q1:CSRF Token和JWT Token冲突吗?
A:不冲突,CSRF Token专门防御跨站请求伪造,JWT用于身份认证,两者可共存:JWT放在Authorization头,CSRF Token放在请求头或参数。
Q2:用了HTTPS就安全了吗?
A:不能,HTTPS保证传输加密,但攻击者仍可通过第三方页面引导受害者浏览器发起合法HTTPS请求,携带Cookie依然有效。
Q3:Referer校验完全可靠吗?
A:不完全,某些浏览器可屏蔽Referer头,攻击者可构造空Referer绕过,建议作为辅助措施,结合Token使用。
Q4:移动端App需要防御CSRF吗?
A:需要,如果App内的WebView加载网页,依然可能受攻击;原生App若使用Cookie或Token,同样面临跨资源伪造风险。
Q5:SameSite=Strict会不会影响正常用户体验?
A:会的,例如用户从邮件点击链接进入网站后,可能无法自动登录,建议使用 Lax 模式,并配合其他验证。
总结与最佳实践
防护优先级
- 必选:CSRF Token + SameSite Cookie
- 加强:同源检测(Origin/Referer)
- 兜底:关键操作二次验证
开发建议
- 框架支持:Spring Security、Django、Laravel等均内置CSRF防御机制,优先启用
- 测试工具:使用Burp Suite、OWASP ZAP扫描CSRF漏洞
- 日志监控:记录Token校验失败、异常Origin请求,及时告警
- 定期更新:CSRF令牌应随会话或密钥更新,避免长期复用
最终防线
用户端:不点击可疑链接,退出登录后清除Cookie
服务端:多层防御、纵深防御,不依赖单一手段
架构层:使用独立的认证服务(如OAuth 2.0),全链路限制跨站攻击
没有绝对安全的系统,只有不断完善的防御体系,CSRF的防御必须结合业务场景、用户习惯和技术栈,才能构建真正坚固的安全屏障。