跨站请求伪造(CSRF)攻击与防御详解
字数 1408 2025-11-13 19:38:06

跨站请求伪造(CSRF)攻击与防御详解

知识点描述
跨站请求伪造(CSRF)是一种恶意攻击技术,攻击者诱骗已认证用户在不知情的情况下,以其身份向受信任的网站提交非预期请求。例如,用户登录银行网站后,访问恶意页面时自动触发转账请求。由于浏览器会自动携带用户的Cookie,服务器会误认为是用户的自愿操作。CSRF的核心漏洞在于:Web应用仅依赖Cookie等自动携带的凭证验证请求,而未校验请求的意图是否源自用户真实意愿。

解题过程循序渐进讲解

  1. 理解CSRF攻击的必要条件

    • 用户已登录目标站点:受害者在浏览器中保持登录状态(如会话Cookie有效)。
    • 目标站点未部署CSRF防护:请求仅通过Cookie验证身份,无其他随机令牌(Token)或二次确认。
    • 用户触发恶意请求:用户访问攻击者构造的页面,页面自动发送伪造请求(如通过图片标签、表单提交)。
    • 示例:用户登录bank.com后,访问恶意页面,页面隐藏一个表单自动提交转账请求至bank.com/transfer?to=attacker&amount=1000
  2. 分析CSRF攻击的常见载体

    • 自动触发型标签
      <img src="https://bank.com/transfer?to=attacker&amount=1000">
      
      浏览器加载图片时自动发送GET请求(但敏感操作应禁用GET方法)。
    • 表单伪造提交
      <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>
      
      页面加载后通过JavaScript自动提交表单。
    • AJAX请求:需注意跨域限制,但某些旧浏览器或配置不当的CORS策略可能允许请求。
  3. 设计CSRF防御机制的核心思路

    • 验证请求来源
      • 检查OriginReferer请求头,确保请求来自同一域名。
      • 局限性:某些浏览器隐私设置可能缺失这些头,或HTTP页面跳转HTTPS时Referer被剥离。
    • 使用随机令牌(CSRF Token)
      • 服务器生成随机Token存入用户会话,并嵌入表单或页面Meta标签。
      • 每次提交请求时验证Token是否匹配。
      • 关键点:Token需足够随机(如32字节以上)、与会话绑定、每次请求更新(敏感操作)。
    • 双重Cookie验证
      • 将Token存入Cookie,并通过请求体(如表单字段)或头(如X-CSRF-Token)发送相同值。
      • 服务器比较两者是否一致,避免跨域请求携带自定义头(受同源策略限制)。
  4. 实施防御时的注意事项

    • Token存储与验证逻辑
      • Token不应通过GET请求传递(避免URL泄露)。
      • 验证时对比会话中的Token与请求中的Token,而非直接匹配字符串,防止时序攻击。
    • Cookie属性加固
      • 设置SameSite=Strict/Lax属性,阻止跨站请求自动携带Cookie(但Lax模式允许导航类GET请求)。
    • 敏感操作二次认证
      • 关键操作(如转账)要求重新输入密码或验证码。
  5. 进阶场景与边缘案例

    • JSON API的CSRF防护
      • 默认浏览器不自动发送JSON跨域请求,但某些插件或旧浏览器可能支持表单提交。
      • 建议额外添加Token或验证Content-Type: application/json(但需注意某些环境可篡改)。
    • 子域名隔离风险
      • 若主域名与子域名共享认证,需确保Token或Cookie的Scope严格限制,避免子域名被攻击者控制时泄露Token。

通过以上步骤,可系统理解CSRF的攻击原理、实现方式及防御策略,重点在于打破“浏览器自动携带凭证即可信任”的假设,通过意图验证确保请求合法性。

跨站请求伪造(CSRF)攻击与防御详解 知识点描述 跨站请求伪造(CSRF)是一种恶意攻击技术,攻击者诱骗已认证用户在不知情的情况下,以其身份向受信任的网站提交非预期请求。例如,用户登录银行网站后,访问恶意页面时自动触发转账请求。由于浏览器会自动携带用户的Cookie,服务器会误认为是用户的自愿操作。CSRF的核心漏洞在于:Web应用仅依赖Cookie等自动携带的凭证验证请求,而未校验请求的意图是否源自用户真实意愿。 解题过程循序渐进讲解 理解CSRF攻击的必要条件 用户已登录目标站点 :受害者在浏览器中保持登录状态(如会话Cookie有效)。 目标站点未部署CSRF防护 :请求仅通过Cookie验证身份,无其他随机令牌(Token)或二次确认。 用户触发恶意请求 :用户访问攻击者构造的页面,页面自动发送伪造请求(如通过图片标签、表单提交)。 示例 :用户登录 bank.com 后,访问恶意页面,页面隐藏一个表单自动提交转账请求至 bank.com/transfer?to=attacker&amount=1000 。 分析CSRF攻击的常见载体 自动触发型标签 : 浏览器加载图片时自动发送GET请求(但敏感操作应禁用GET方法)。 表单伪造提交 : 页面加载后通过JavaScript自动提交表单。 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请求)。 敏感操作二次认证 : 关键操作(如转账)要求重新输入密码或验证码。 进阶场景与边缘案例 JSON API的CSRF防护 : 默认浏览器不自动发送JSON跨域请求,但某些插件或旧浏览器可能支持表单提交。 建议额外添加Token或验证 Content-Type: application/json (但需注意某些环境可篡改)。 子域名隔离风险 : 若主域名与子域名共享认证,需确保Token或Cookie的Scope严格限制,避免子域名被攻击者控制时泄露Token。 通过以上步骤,可系统理解CSRF的攻击原理、实现方式及防御策略,重点在于打破“浏览器自动携带凭证即可信任”的假设,通过意图验证确保请求合法性。