CSRF(Cross-site request forgery),中文称为跨站请求伪造,是一种网络攻击方式。攻击者通过伪造用户的请求,利用用户已登录的身份在网站上执行非授权的操作,如转账、修改密码等。这种攻击方式的关键在于攻击者能够预测或知道所有必要的请求参数。
目录
一、攻击原理:身份冒用的“自动化陷阱”
核心逻辑:攻击者利用浏览器「自动携带用户登录凭证(如Cookie)」的机制,伪造用户身份发送恶意请求。
关键条件:
- 用户已登录目标网站:如用户登录网银后未退出,Cookie保持有效(类似“已解锁的保险箱”)。
- 网站未校验请求来源:未检查请求是否来自合法页面(类似“快递员不核对寄件人身份”)。
攻击过程:
- 用户登录:用户访问银行网站,登录后浏览器存储Cookie(钥匙)。
- 诱导访问恶意页面:用户点击钓鱼链接或访问含恶意代码的网页(陷阱)。
- 自动触发请求:恶意代码通过
<img>
标签或隐藏表单向银行发送转账请求(自动化的“假指令”)。 - 服务器误判:银行看到Cookie合法,执行转账(钥匙匹配,但操作非用户真实意图)。
比喻:
就像你家的智能门锁记住了你的指纹,小偷伪造你的指纹模后按在门锁上——门锁只认指纹不认人,导致家中被盗。
二、典型案例:攻击者的“伪装术”
1. 基础攻击类型
-
GET型攻击:
恶意链接嵌入图片标签:<img src="http://bank.com/transfer?to=黑客账户&amount=1000">
用户点击后自动触发转账(看似加载图片,实则执行操作)。
-
POST型攻击:
构造隐藏表单并自动提交:<form action="http://bank.com/transfer" method="POST"> <input type="hidden" name="to" value="黑客账户"> <input type="hidden" name="amount" value="1000"> </form> <script>document.forms[0].submit();</script>
用户访问页面即触发转账。
2. 真实场景
- 银行转账漏洞:用户访问钓鱼网站后,资金被自动转至攻击者账户。
- 社交平台信息篡改:伪造好友请求链接,用户点击后自动发送垃圾消息。
- XSS+CSRF组合攻击:通过XSS漏洞窃取Token,绕过防御执行高权限操作。
类比:
攻击者伪造你的签名(Cookie),向银行下达转账指令(请求),银行因“笔迹鉴定通过”而执行操作。
三、防御策略:构建“身份验证防火墙”
1. 服务端核心防御
-
CSRF Token验证:
- 生成:每次会话生成唯一随机Token(类似“动态密码”),存储于服务端会话或加密Cookie。
- 嵌入:将Token插入表单或请求头(如
X-CSRF-Token
)。 - 验证:服务端比对请求中的Token与存储值,不一致则拒绝。
<!-- 表单示例 --> <form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="动态令牌值"> <!-- 其他字段 --> </form>
-
SameSite Cookie属性:
- 设置:Cookie添加
SameSite=Strict
或Lax
,限制跨站携带(类似“快递员只接受本人签收”)。 - 效果:
Strict
完全禁止跨站请求携带Cookie,Lax
允许安全方法(如GET导航)。
- 设置:Cookie添加
-
二次验证:
关键操作(如转账)需短信验证码、指纹识别等二次确认(类似“银行转账需短信+U盾”)。
2. 客户端与开发规范
- 避免GET执行写操作:仅用POST/PUT/DELETE处理数据变更(符合RESTful规范)。
- 自动化检测工具:使用OWASP ZAP、Deemon等工具扫描未受保护的API端点。
比喻:
防御CSRF就像在保险箱上加装动态密码锁(Token)、限制钥匙使用范围(SameSite)、重要操作需双重验证(短信)——攻击者即使拿到钥匙也无法打开。
四、最佳实践:多层防御体系
- 技术层:
- 必选:Token验证 + SameSite Cookie(覆盖80%攻击场景)。
- 增强:关键操作添加二次验证(如支付宝的指纹支付)。
- 开发规范:
- 遵循“最小权限原则”,敏感接口默认拒绝跨域请求。
- 定期更新依赖库,修复已知漏洞(如框架的CSRF中间件)。
- 监控响应:
- 部署WAF(Web应用防火墙)拦截异常请求。
- 日志分析工具(如ELK)追踪高频敏感操作。
企业案例:
。en+设备指纹+行为分析,拦截率超99.98%;AWS控制台通过SameSite Strict实现零CSRF漏洞报告。
总结
CSRF攻击的本质是“身份冒用”,防御需构建从身份验证到行为监控的完整链条:
- 基础层:Token与SameSite Cookie阻断自动化攻击。
- 增强层:二次验证确保关键操作安全。
- 持续优化:工具扫描与日志监控应对新型攻击手法。
一句话记忆:
“钥匙(Cookie)保管好,动态密码(Token)不能少,重要操作双人验(二次验证),跨站请求全拒掉(SameSite)。”