跨站请求伪造(CSRF)攻击详解
字数 1128 2025-11-07 12:34:03

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

1. 问题描述

跨站请求伪造(CSRF)是一种攻击技术,攻击者诱骗已登录用户在不知情的情况下执行非本意的操作(如修改密码、转账等)。其核心原理是利用用户已登录的会话凭证(如Cookie)自动携带在请求中的特性,通过伪造请求触发目标网站的业务逻辑。


2. CSRF攻击的必要条件

  1. 用户已登录目标网站:会话凭证(如Session Cookie)有效。
  2. 用户访问恶意页面:攻击者诱导用户点击链接或访问包含恶意代码的页面。
  3. 目标网站未部署CSRF防护措施:请求缺乏不可伪造的校验机制。

3. 攻击场景举例

假设某银行网站支持通过GET请求修改密码:

GET http://bank.com/change-password?newpass=123456

攻击者构造一个隐藏的图片请求嵌入恶意页面:

<img src="http://bank.com/change-password?newpass=hacked" />

用户访问该页面时,浏览器自动携带已登录的Cookie发送请求,密码被悄无声息地修改。


4. CSRF攻击的完整流程

  1. 用户登录银行网站:浏览器保存Session Cookie。
  2. 用户被诱导访问恶意网站(如通过钓鱼邮件)。
  3. 恶意网站包含伪造请求:可能是自动提交的表单、图片链接或JavaScript发起的AJAX请求。
  4. 浏览器自动附加Cookie:向银行网站发送请求,服务器误认为是用户合法操作。
  5. 攻击完成:密码修改、转账等操作被执行。

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属性为StrictLax,限制跨域请求自动携带Cookie。
    • Strict:完全禁止跨站携带Cookie。
    • Lax:允许部分安全请求(如GET导航)携带Cookie,但阻止POST等非安全请求。

(4)验证请求来源(Referer/Origin头)

  • 检查RefererOrigin头是否来自合法域名,但可能被某些浏览器或插件禁用。

(5)二次验证

  • 对敏感操作要求用户重新输入密码或进行双因素认证。

6. 总结

CSRF攻击依赖浏览器自动发送凭证的机制,防御需从请求不可伪造性(如Token)或限制凭证发送(如SameSite Cookie)入手。实际开发中推荐组合使用多种措施(如Token + SameSite),并避免使用GET请求执行敏感操作。

跨站请求伪造(CSRF)攻击详解 1. 问题描述 跨站请求伪造(CSRF)是一种攻击技术,攻击者诱骗已登录用户在不知情的情况下执行非本意的操作(如修改密码、转账等)。其核心原理是 利用用户已登录的会话凭证(如Cookie)自动携带在请求中的特性 ,通过伪造请求触发目标网站的业务逻辑。 2. CSRF攻击的必要条件 用户已登录目标网站 :会话凭证(如Session Cookie)有效。 用户访问恶意页面 :攻击者诱导用户点击链接或访问包含恶意代码的页面。 目标网站未部署CSRF防护措施 :请求缺乏不可伪造的校验机制。 3. 攻击场景举例 假设某银行网站支持通过GET请求修改密码: 攻击者构造一个隐藏的图片请求嵌入恶意页面: 用户访问该页面时,浏览器自动携带已登录的Cookie发送请求,密码被悄无声息地修改。 4. CSRF攻击的完整流程 用户登录银行网站 :浏览器保存Session Cookie。 用户被诱导访问恶意网站 (如通过钓鱼邮件)。 恶意网站包含伪造请求 :可能是自动提交的表单、图片链接或JavaScript发起的AJAX请求。 浏览器自动附加Cookie :向银行网站发送请求,服务器误认为是用户合法操作。 攻击完成 :密码修改、转账等操作被执行。 5. 防御措施详解 (1)同源策略(SOP)的局限性 浏览器禁止跨域读取响应内容,但 允许发送跨域请求 (如表单提交、图片加载),因此SOP无法阻止CSRF。 (2)CSRF Token验证 原理 :在表单或请求参数中添加一个随机生成的Token(存储在服务端或Session中),服务端校验Token的合法性。 示例 : 关键点 :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请求执行敏感操作。