跨站请求伪造(CSRF)攻击详解
字数 1128 2025-11-07 12:34:03
跨站请求伪造(CSRF)攻击详解
1. 问题描述
跨站请求伪造(CSRF)是一种攻击技术,攻击者诱骗已登录用户在不知情的情况下执行非本意的操作(如修改密码、转账等)。其核心原理是利用用户已登录的会话凭证(如Cookie)自动携带在请求中的特性,通过伪造请求触发目标网站的业务逻辑。
2. CSRF攻击的必要条件
- 用户已登录目标网站:会话凭证(如Session Cookie)有效。
- 用户访问恶意页面:攻击者诱导用户点击链接或访问包含恶意代码的页面。
- 目标网站未部署CSRF防护措施:请求缺乏不可伪造的校验机制。
3. 攻击场景举例
假设某银行网站支持通过GET请求修改密码:
GET http://bank.com/change-password?newpass=123456
攻击者构造一个隐藏的图片请求嵌入恶意页面:
<img src="http://bank.com/change-password?newpass=hacked" />
用户访问该页面时,浏览器自动携带已登录的Cookie发送请求,密码被悄无声息地修改。
4. CSRF攻击的完整流程
- 用户登录银行网站:浏览器保存Session Cookie。
- 用户被诱导访问恶意网站(如通过钓鱼邮件)。
- 恶意网站包含伪造请求:可能是自动提交的表单、图片链接或JavaScript发起的AJAX请求。
- 浏览器自动附加Cookie:向银行网站发送请求,服务器误认为是用户合法操作。
- 攻击完成:密码修改、转账等操作被执行。
5. 防御措施详解
(1)同源策略(SOP)的局限性
浏览器禁止跨域读取响应内容,但允许发送跨域请求(如表单提交、图片加载),因此SOP无法阻止CSRF。
(2)CSRF Token验证
- 原理:在表单或请求参数中添加一个随机生成的Token(存储在服务端或Session中),服务端校验Token的合法性。
- 示例:
<form action="/change-password" method="POST"> <input type="hidden" name="csrf_token" value="随机字符串"/> <!-- 其他表单字段 --> </form> - 关键点:Token需与用户会话绑定,且攻击者无法通过跨域请求获取(因SOP限制)。
(3)SameSite Cookie属性
- 原理:设置Cookie的
SameSite属性为Strict或Lax,限制跨域请求自动携带Cookie。Strict:完全禁止跨站携带Cookie。Lax:允许部分安全请求(如GET导航)携带Cookie,但阻止POST等非安全请求。
(4)验证请求来源(Referer/Origin头)
- 检查
Referer或Origin头是否来自合法域名,但可能被某些浏览器或插件禁用。
(5)二次验证
- 对敏感操作要求用户重新输入密码或进行双因素认证。
6. 总结
CSRF攻击依赖浏览器自动发送凭证的机制,防御需从请求不可伪造性(如Token)或限制凭证发送(如SameSite Cookie)入手。实际开发中推荐组合使用多种措施(如Token + SameSite),并避免使用GET请求执行敏感操作。