跨站请求伪造(CSRF)攻击详解
字数 814 2025-11-08 20:56:49
跨站请求伪造(CSRF)攻击详解
描述
跨站请求伪造(CSRF)是一种利用用户已登录的身份,在用户不知情的情况下执行非预期操作的攻击。例如,用户登录银行网站后,访问恶意页面,该页面可能自动触发转账请求。由于浏览器会自动携带用户的Cookie,服务器会误认为是用户的自愿操作。CSRF的核心问题在于:服务器无法区分请求是来自用户真实意图还是恶意诱导。
攻击原理
-
依赖条件:
- 用户已登录目标网站(如银行网站),会话Cookie有效。
- 用户访问恶意页面(如钓鱼邮件中的链接)。
- 目标网站未部署CSRF防护措施。
-
攻击过程:
- 恶意页面隐藏一个自动提交的表单或发送AJAX请求,指向目标网站的敏感接口(如修改密码的URL)。
- 浏览器发起请求时自动附加用户的Cookie,服务器验证会话后执行操作。
示例场景:
假设银行转账接口为:
POST /transfer HTTP/1.1
Host: bank.com
Content-Type: application/x-www-form-urlencoded
to_account=attacker&amount=1000
攻击者构造一个隐藏表单的页面:
<form action="http://bank.com/transfer" method="POST" id="csrf-form">
<input type="hidden" name="to_account" value="attacker">
<input type="hidden" name="amount" value="1000">
</form>
<script>document.getElementById('csrf-form').submit();</script>
用户访问该页面时,转账请求自动发送。
防御措施
-
CSRF Token(最常用):
- 服务器生成随机Token(如会话绑定),嵌入表单或请求头(如自定义Header)。
- 提交请求时验证Token合法性,恶意页面无法获取Token(受同源策略限制)。
-
SameSite Cookie属性:
- 设置Cookie的
SameSite=Strict或Lax,限制第三方网站发起请求时携带Cookie。
- 设置Cookie的
-
验证Referer/Origin头:
- 检查请求来源域名是否在白名单内,但可能被某些浏览器或插件绕过。
-
二次确认:
- 敏感操作要求用户重新输入密码或验证码。
对比CSRF与XSS:
- XSS:利用用户对网站的信任,在网站中注入恶意脚本。
- CSRF:利用网站对用户浏览器的信任,诱导用户发起请求。
实际部署建议:
- 关键操作(如转账、改密)优先使用CSRF Token+SameSite Cookie组合防护。
- 避免仅依赖Referer检查,因其可靠性受环境影响。