跨站请求伪造(CSRF)攻击详解
1. 知识点描述
跨站请求伪造(CSRF)是一种恶意攻击方式。攻击者诱导用户在当前已登录的Web应用中执行非本意的操作。例如,用户登录银行网站后,在未退出的情况下访问了恶意链接,该链接可能自动发起转账请求,而浏览器会携带用户的登录凭证(如Cookie)完成操作。CSRF的本质是利用受害者的身份验证状态,以用户名义执行未经授权的请求。
2. CSRF攻击的必要条件
- 用户已登录目标网站(如银行、社交平台),会话未过期。
- 用户访问了攻击者构造的恶意页面(如钓鱼邮件中的链接)。
- 目标网站未部署有效的CSRF防护机制。
3. 攻击原理分步解析
步骤1:用户登录可信网站
用户通过浏览器登录example-bank.com,服务器返回包含会话ID的Cookie,浏览器会保存该Cookie。
步骤2:诱导用户访问恶意页面
攻击者构造一个隐藏的请求,并诱导用户访问(例如通过邮件或论坛嵌入的链接):
<!-- 恶意页面内容 -->
<img src="http://example-bank.com/transfer?to=attacker&amount=1000" width="0" height="0">
当用户访问此页面时,浏览器自动发送GET请求,并携带已保存的Cookie。
步骤3:服务器误认为用户自愿操作
服务器验证Cookie有效后,执行转账操作,攻击完成。
更隐蔽的POST请求示例:
<form id="csrf-form" action="http://example-bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="1000">
</form>
<script>document.getElementById('csrf-form').submit();</script>
4. 防御措施详解
(1)同源策略(SOP)的局限性
同源策略阻止跨域读取响应,但不阻止跨域发送请求。因此恶意页面仍可发起请求(如表单提交),服务器仍可能处理。
(2)CSRF Token机制
- 服务器为每个会话生成一个随机Token,嵌入表单或请求头中:
<form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="随机字符串"> <!-- 其他字段 --> </form> - 提交请求时,服务器验证Token是否匹配。恶意页面无法获取此Token(受SOP限制)。
(3)SameSite Cookie属性
设置Cookie的SameSite属性,限制跨站请求携带Cookie:
Strict:完全禁止跨站携带Cookie(可能影响用户体验)。Lax:允许部分安全请求(如GET)携带Cookie,阻止非安全请求(如POST)。
(4)验证请求来源(Referer/Origin头)
服务器检查HTTP头中的Referer或Origin字段,确保请求来自同一域名。但需处理隐私模式下Referer缺失的情况。
(5)关键操作需二次确认
对于敏感操作(如转账),要求用户重新输入密码或验证码。
5. 实际场景示例
- 防御配置示例(SameSite Cookie):
服务器设置Cookie:Set-Cookie: sessionid=abc123; SameSite=Lax; HttpOnly - Token验证流程:
用户访问页面时,服务器动态生成Token并嵌入表单;提交后比对服务端存储的Token。
6. 总结
CSRF攻击利用的是浏览器的默认Cookie携带机制,防御核心是确保请求来自合法来源。结合Token、SameSite Cookie和来源验证,可有效防护此类攻击。