2.3 跨站请求伪造(CSRF)防护
什么是CSRF?
跨站请求伪造(CSRF)是一种恶意攻击手段,攻击者诱骗用户在已登录的Web应用中执行非预期的操作。例如,用户登录银行网站后,误点击恶意链接,导致攻击者以用户身份发起转账请求。这种攻击利用的是浏览器对用户会话的自动信任机制。
攻击原理
- 依赖会话Cookie:用户登录后,浏览器会存储会话Cookie,后续请求自动携带该Cookie。
- 伪造请求:攻击者构造一个恶意页面(如隐藏的表单或图片链接),诱导用户触发。
- 服务器误判:由于请求携带合法Cookie,服务器无法区分是否为用户真实意图。
防护策略
1. 使用CSRF Token
- 核心思想:为每个表单或敏感请求生成唯一的随机令牌(Token),服务器验证该令牌的合法性。
- 实现方式:
- 用户访问页面时,服务器生成Token并嵌入表单(如
<input type="hidden" name="csrf_token" value="随机字符串">
)。 - 提交表单时,服务器比对Token与会话中存储的值,不一致则拒绝请求。
- 用户访问页面时,服务器生成Token并嵌入表单(如
- 优势:攻击者无法预测或窃取Token,伪造请求失效。
2. 同源策略(SameSite Cookie)
- 通过设置Cookie的
SameSite
属性,限制第三方网站发起的请求携带Cookie:SameSite=Strict
:完全禁止第三方请求携带Cookie。SameSite=Lax
:仅允许安全方法(如GET)的顶级导航携带Cookie。
- 适用场景:兼容现代浏览器,但对旧版浏览器支持有限。
3. 验证HTTP Referer/Origin头部
- 检查请求来源是否为合法域名:
Referer
头部应匹配预期域名(但可能被篡改或缺失)。Origin
头部更可靠(适用于AJAX请求)。
- 局限性:依赖客户端信息,隐私设置可能影响其准确性。
4. 二次确认机制
- 对敏感操作(如转账、删除)要求用户二次输入密码或验证码。
- 用户体验权衡:安全性提升,但操作流程变复杂。
实际应用示例
- Django框架:内置
{% csrf_token %}
模板标签,自动处理Token生成与验证。 - Spring Security:通过
CsrfFilter
默认启用CSRF防护。
文末点睛
CSRF如一场“身份盗窃”的魔术,攻击者借用户之手完成恶意操作。防护的关键在于打破“浏览器自动信任”的链条——无论是Token的暗号验证,还是Cookie的缄默约束,皆为在便捷与安全间筑起一道透明的墙。技术之外,开发者需时刻警惕:信任,但验证(Trust, but verify)。
这一切,似未曾拥有