CSRF跨站请求伪造攻击详解
字数 990 2025-11-03 00:19:05
CSRF跨站请求伪造攻击详解
描述
CSRF(Cross-Site Request Forgery)是一种恶意利用网站身份验证机制的攻击。攻击者诱骗已登录用户在当前会话状态下,在不知情时向信任网站提交恶意请求(如转账、改密码)。其核心在于利用浏览器自动携带Cookie的特性,让用户"被代表"执行非本意操作。
攻击原理分步解析
- 身份验证依赖:用户登录A网站后,服务端返回的Session Cookie会被浏览器自动存储,并在后续请求中自动附加
- 会话保持漏洞:只要用户未登出或会话未过期,浏览器发起任何指向A网站的请求都会携带有效Cookie
- 伪造请求构造:攻击者创建隐藏表单、恶意图片链接等,包含修改数据的关键参数(如
transfer?to=attacker&amount=1000) - 诱骗触发:通过邮件/论坛等渠道使用户访问恶意页面,浏览器自动执行请求并携带合法Cookie,服务端误判为用户自愿操作
典型攻击场景示例
假设银行网站转账接口为:
POST /transfer HTTP/1.1
Cookie: session=user_session_id
Content-Type: application/x-www-form-urlencoded
to_account=ATTACKER&amount=10000
攻击者构造恶意页面:
<img src="http://bank.com/transfer?to_account=ATTACKER&amount=10000" />
<!-- 或隐藏表单 -->
<body onload="document.forms[0].submit()">
<form action="http://bank.com/transfer" method="POST">
<input type="hidden" name="to_account" value="ATTACKER">
<input type="hidden" name="amount" value="10000">
</form>
</body>
防御措施分层详解
- 同源策略检查:服务端验证HTTP请求头中的Origin/Referer字段,确保请求来源与目标域名一致
- CSRF Token防护:
- 服务端生成随机Token(如
csrftoken=abc123)存入Session并嵌入表单(或Meta标签) - 提交请求时要求携带Token,服务端校验其与会话中存储的是否匹配
- 关键:Token需随机化、绑定会话、每次更新(重要操作需刷新)
- 服务端生成随机Token(如
- 双重Cookie验证:将Cookie中的值作为参数附加到请求中,服务端比较Cookie与参数值是否一致
- 关键操作强化:
- 敏感操作要求二次认证(密码、短信验证码)
- 使用自定义Header(需配合CORS配置)
- 浏览器防护:
- SameSite Cookie属性(Strict/Lax限制第三方Cookie携带)
- 关键接口使用JSON API并避免GET请求修改数据
进阶防护思路
- 用户交互验证:添加滑动验证码/行为验证码增加攻击成本
- 请求指纹校验:结合User-Agent/IP地址等生成请求指纹
- 关键操作日志:记录操作IP、时间、设备信息用于异常追溯
通过组合防御策略(如Token+SameSite Cookie),可有效阻断CSRF攻击链。核心在于确保请求的"真实性"而非仅"合法性"。