跨站请求伪造(CSRF)攻击与防御详解
字数 1408 2025-11-13 19:38:06
跨站请求伪造(CSRF)攻击与防御详解
知识点描述
跨站请求伪造(CSRF)是一种恶意攻击技术,攻击者诱骗已认证用户在不知情的情况下,以其身份向受信任的网站提交非预期请求。例如,用户登录银行网站后,访问恶意页面时自动触发转账请求。由于浏览器会自动携带用户的Cookie,服务器会误认为是用户的自愿操作。CSRF的核心漏洞在于:Web应用仅依赖Cookie等自动携带的凭证验证请求,而未校验请求的意图是否源自用户真实意愿。
解题过程循序渐进讲解
-
理解CSRF攻击的必要条件
- 用户已登录目标站点:受害者在浏览器中保持登录状态(如会话Cookie有效)。
- 目标站点未部署CSRF防护:请求仅通过Cookie验证身份,无其他随机令牌(Token)或二次确认。
- 用户触发恶意请求:用户访问攻击者构造的页面,页面自动发送伪造请求(如通过图片标签、表单提交)。
- 示例:用户登录
bank.com后,访问恶意页面,页面隐藏一个表单自动提交转账请求至bank.com/transfer?to=attacker&amount=1000。
-
分析CSRF攻击的常见载体
- 自动触发型标签:
浏览器加载图片时自动发送GET请求(但敏感操作应禁用GET方法)。<img src="https://bank.com/transfer?to=attacker&amount=1000"> - 表单伪造提交:
页面加载后通过JavaScript自动提交表单。<form action="https://bank.com/transfer" method="POST"> <input type="hidden" name="to" value="attacker"> <input type="hidden" name="amount" value="1000"> </form> <script>document.forms[0].submit();</script> - AJAX请求:需注意跨域限制,但某些旧浏览器或配置不当的CORS策略可能允许请求。
- 自动触发型标签:
-
设计CSRF防御机制的核心思路
- 验证请求来源:
- 检查
Origin或Referer请求头,确保请求来自同一域名。 - 局限性:某些浏览器隐私设置可能缺失这些头,或HTTP页面跳转HTTPS时Referer被剥离。
- 检查
- 使用随机令牌(CSRF Token):
- 服务器生成随机Token存入用户会话,并嵌入表单或页面Meta标签。
- 每次提交请求时验证Token是否匹配。
- 关键点:Token需足够随机(如32字节以上)、与会话绑定、每次请求更新(敏感操作)。
- 双重Cookie验证:
- 将Token存入Cookie,并通过请求体(如表单字段)或头(如X-CSRF-Token)发送相同值。
- 服务器比较两者是否一致,避免跨域请求携带自定义头(受同源策略限制)。
- 验证请求来源:
-
实施防御时的注意事项
- Token存储与验证逻辑:
- Token不应通过GET请求传递(避免URL泄露)。
- 验证时对比会话中的Token与请求中的Token,而非直接匹配字符串,防止时序攻击。
- Cookie属性加固:
- 设置
SameSite=Strict/Lax属性,阻止跨站请求自动携带Cookie(但Lax模式允许导航类GET请求)。
- 设置
- 敏感操作二次认证:
- 关键操作(如转账)要求重新输入密码或验证码。
- Token存储与验证逻辑:
-
进阶场景与边缘案例
- JSON API的CSRF防护:
- 默认浏览器不自动发送JSON跨域请求,但某些插件或旧浏览器可能支持表单提交。
- 建议额外添加Token或验证
Content-Type: application/json(但需注意某些环境可篡改)。
- 子域名隔离风险:
- 若主域名与子域名共享认证,需确保Token或Cookie的Scope严格限制,避免子域名被攻击者控制时泄露Token。
- JSON API的CSRF防护:
通过以上步骤,可系统理解CSRF的攻击原理、实现方式及防御策略,重点在于打破“浏览器自动携带凭证即可信任”的假设,通过意图验证确保请求合法性。