CSRF攻击原理
CSRF(Cross-Site Request Forgery,跨站请求伪造) 是一种网络攻击技术,攻击者通过伪装成合法用户的请求,利用用户在目标网站上的身份认证状态,执行非用户本意的操作。其核心在于利用用户的已认证会话,在用户不知情的情况下提交恶意请求。
攻击流程
- 用户登录目标网站:用户已登录某网站(如银行),浏览器保存了会话凭证(如Cookie)。
- 访问恶意网站:用户被诱导访问攻击者控制的网站(如钓鱼邮件中的链接)。
- 触发恶意请求:恶意网站通过HTML/JavaScript自动向目标网站发送请求(如转账操作)。
- 执行非授权操作:目标网站验证请求中的会话凭证有效,执行操作(如转账成功)。
关键特点
- 利用用户身份:攻击者无需获取用户密码,只需利用已登录的会话。
- 隐蔽性强:用户可能完全不知情,操作被伪装成正常请求。
- 依赖浏览器自动发送凭证:如Cookie、HTTP认证头等。
示例
假设用户登录了银行网站(bank.com
),攻击者在恶意网站中嵌入以下代码:
<img src="https://bank.com/transfer?to=attacker&amount=1000" />
当用户访问恶意网站时,浏览器会自动发送请求到bank.com
,携带用户的会话Cookie,导致资金转移。
CSRF防御策略
1. 使用CSRF Token
- 原理:在表单或请求中嵌入一个随机生成的Token,服务器验证Token的有效性。
- 实现:
- 服务器在用户登录时生成Token并存储在会话中。
- 表单或AJAX请求中携带Token。
- 服务器验证请求中的Token与会话中的Token是否匹配。
- 优点:Token难以预测,攻击者无法伪造。
- 示例:
<form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="random_token_here" /> <input type="text" name="amount" /> <button type="submit">Transfer</button> </form>
2. 验证Referer/Origin头
- 原理:检查请求的来源是否来自可信域名。
- 实现:
- 服务器验证
Referer
或Origin
头是否包含目标域名。
- 服务器验证
- 缺点:
- 依赖浏览器发送头信息,可能被用户禁用或伪造。
- 跨域请求可能无法携带头信息。
3. 使用SameSite Cookie属性
- 原理:限制Cookie在跨站请求中的发送。
- 实现:
- 设置Cookie的
SameSite
属性为Strict
或Lax
。Strict
:完全禁止跨站请求发送Cookie。Lax
:允许部分安全跨站请求(如链接跳转)。
- 设置Cookie的
- 优点:减少CSRF攻击面。
- 缺点:可能影响某些正常功能(如第三方嵌入)。
4. 双重提交Cookie
- 原理:将Token同时存储在Cookie和请求参数中,服务器验证两者是否一致。
- 实现:
- 服务器生成Token并存储在Cookie中。
- 表单或请求中携带相同的Token。
- 服务器验证Cookie中的Token与请求参数中的Token是否匹配。
- 优点:无需依赖会话存储,适用于分布式系统。
5. 自定义请求头
- 原理:要求请求携带自定义头(如
X-CSRF-Token
),浏览器跨域请求无法自动添加。 - 实现:
- 客户端通过JavaScript手动设置头信息。
- 服务器验证头信息是否存在且有效。
- 缺点:仅适用于AJAX请求,无法防御表单提交。
6. 验证码
- 原理:在关键操作前要求用户输入验证码。
- 实现:
- 在转账、修改密码等操作前显示验证码。
- 优点:增加攻击难度。
- 缺点:影响用户体验。
防御策略对比
| 策略 | 优点 | 缺点 | 适用场景 |
|---------------------|----------------------------------------|----------------------------------------|--------------------------|
| CSRF Token | 安全性高,通用性强 | 需要额外实现Token生成与验证逻辑 | 几乎所有场景 |
| Referer/Origin验证 | 实现简单 | 依赖浏览器头信息,可能被伪造或禁用 | 低风险场景 |
| SameSite Cookie | 减少攻击面,无需修改业务逻辑 | 可能影响正常功能 | 新系统开发或重构时 |
| 双重提交Cookie | 无需会话存储,适用于分布式系统 | 实现复杂度较高 | 分布式或无状态服务 |
| 自定义请求头 | 防御AJAX请求 | 无法防御表单提交 | 仅AJAX请求的场景 |
| 验证码 | 防御效果好 | 影响用户体验 | 高风险操作(如转账) |
实践
- 优先使用CSRF Token:作为核心防御手段。
- 结合SameSite Cookie:增强安全性,减少攻击面。
- 高风险操作增加验证码:如转账、修改密码等。
- 定期安全审计:检查代码和配置是否存在漏洞。
通过以上策略的组合使用,可以有效防御CSRF攻击,保护用户数据安全。
// 来源:https://www.nzw6.com