在当今数字化时代,网络安全已成为每个企业和个人必须面对的重要课题。其中,CSRF(Cross-site Request Forgery),即跨站请求伪造,是一种极具隐蔽性和破坏力的Web安全漏洞。尽管它不如XSS(跨站脚本)那样广为人知,但其潜在危害同样严重,甚至可能直接导致用户财产损失和隐私泄露。

本文将全面解析CSRF漏洞的原理、常见攻击方式,并提供切实可行的防御策略,帮助开发者和安全爱好者构建更安全的网络环境。
什么是CSRF?—— 定义与核心概念
CSRF,全称Cross-site Request Forgery,中文名为跨站请求伪造,也被称为“一键攻击”或“会话劫持”(One Click Attack / Session Riding)。
简单来说,CSRF攻击的本质是:攻击者诱导用户在已登录目标网站的状态下,访问一个恶意网站或链接,从而以用户的名义执行非预期的操作。
例如:
在你不知情的情况下,向他人转账。
以你的名义发送邮件或发布动态。
修改你的账户密码或添加管理员账号。
与XSS不同,XSS是利用网站对用户的信任来注入恶意脚本,而CSRF则是利用浏览器自动携带Cookie的机制,伪装成合法用户向受信任的网站发起请求。
✅ 关键区别:
XSS:攻击者 → 注入脚本 → 窃取用户数据
CSRF:攻击者 → 伪造请求 → 代表用户执行操作
CSRF攻击原理:为什么能成功?
要理解CSRF为何能成功,我们需要了解其攻击链条中的两个核心条件:
攻击前提(必须同时满足):
用户已登录目标网站A,并在浏览器中保存了有效的会话凭证(如Cookie)。
用户在未退出登录的情况下访问了恶意网站B,该网站包含诱导执行目标操作的代码。
攻击流程图解:
当用户访问恶意网站B时,页面中的隐藏表单、图片标签或JavaScript代码会自动向网站A发起请求。由于浏览器会自动附带之前登录A时生成的Cookie,服务器误认为这是合法用户发起的真实请求,于是执行相应操作。
⚠️ 根本原因:
Web的身份验证机制只能确认“请求来自某个用户的浏览器”,却无法判断“该请求是否经过用户授权”。
CSRF攻击类型详解
根据HTTP请求方式的不同,CSRF攻击主要分为以下几种类型:
1. GET型CSRF(最简单且危险)
当目标网站使用GET请求进行敏感操作(如转账、删除等),攻击者只需构造一个URL即可完成攻击。
示例:
假设某银行转账接口为:
攻击者只需在恶意网页中嵌入:
一旦用户登录银行后访问该页面,浏览器会自动加载图片,触发转账请求。
💡 防范建议:永远不要用GET请求处理敏感操作!应遵循REST规范,使用POST/PUT/DELETE等方法。
2. POST型CSRF(更隐蔽)
随着安全意识提升,多数网站已改用POST请求处理关键操作。但这并不能完全避免CSRF,因为攻击者可通过HTML表单+JavaScript自动提交来绕过。
攻击代码示例:
该代码可在用户无感知的情况下自动提交表单,完成转账操作。
3. JSON型CSRF(需配合XSS)
现代应用多采用AJAX + JSON通信。虽然浏览器同源策略限制跨域发送JSON请求,但若目标站点存在CORS配置不当或存在XSS漏洞,仍可被利用。
常见组合攻击:CSRF + XSS
攻击者先通过XSS漏洞获取CSRF Token,再构造AJAX请求完成攻击:
CSRF实战案例分析
案例1:利用CSRF添加管理员账户
某WordPress后台存在CSRF漏洞,攻击者构造如下HTML页面:
只要管理员登录后访问该页面,就会自动创建一个拥有最高权限的黑客账户。
案例2:Gmail历史漏洞(2007年)
安全研究员pdp曾利用CSRF漏洞,在用户不知情的情况下修改Gmail过滤规则,将所有带附件的邮件转发至攻击者邮箱,造成严重信息泄露。
如何有效防御CSRF攻击?
防范CSRF的核心思想是:在请求中加入攻击者无法预测或伪造的信息。以下是主流防御方案:
1. 使用CSRF Token(最有效)
服务器为每个会话生成唯一的随机Token,并嵌入表单或响应头中。每次提交请求时需验证Token是否匹配。
✅ 优点:安全性高
❌ 缺点:需前后端协同实现
2. 验证HTTP Referer头
检查请求来源是否属于本站域名,拒绝来自外部站点的请求。
✅ 优点:实现简单
❌ 缺点:Referer可能被篡改或为空,适合作为辅助手段
3. 设置Cookie的SameSite属性
现代浏览器支持Cookie的SameSite属性,可防止跨站请求携带Cookie。
Strict:完全禁止跨站携带CookieLax:允许安全的GET请求携带CookieNone:允许跨站携带(需配合Secure)
✅ 推荐设置为
SameSite=Lax或Strict
4. 双重提交Cookie(Double Submit Cookie)
将CSRF Token同时写入Cookie和表单,在服务端比对两者是否一致。
✅ 无需服务器存储Token,适合分布式系统
5. 敏感操作增加验证码或二次确认
对于转账、修改密码等高风险操作,强制用户输入验证码或点击确认按钮。
✅ 用户体验稍差,但安全性极高
构建安全的Web应用
| 防御措施 | 安全性 | 实现难度 | 推荐程度 |
|---|---|---|---|
| CSRF Token | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ✅✅✅✅✅ |
| SameSite Cookie | ⭐⭐⭐⭐ | ⭐ | ✅✅✅✅ |
| Referer检查 | ⭐⭐ | ⭐ | ✅✅(辅助) |
| 双重提交Cookie | ⭐⭐⭐⭐ | ⭐⭐ | ✅✅✅✅ |
| 验证码 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ✅✅✅(高危操作) |
CSRF虽不如XSS显眼,但其危害不容小觑。作为开发者,应始终坚持“安全左移”原则,在设计阶段就考虑安全机制。定期进行安全审计、及时修补已知漏洞,是保障系统稳定运行的关键。
🔐 记住:真正的安全,不是等到被攻击才去防御,而是从一开始就构建坚固的防线。





















