什么是跨站点请求伪造?

跨站点请求伪造攻击诱使受害者使用他们的凭证来调用状态更改活动。

学习目标

阅读本文后,您将能够:

  • 定义跨站点请求伪造 (CSRF)
  • 说明 CSRF 攻击如何工作
  • 探索缓解 CSRF 攻击的方法

相关内容


想要继续学习吗?

接收有关最流行互联网见解的每月总结。

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

什么是跨站点请求伪造 (CSRF)?

跨站点请求伪造攻击是一种混淆的代理*网络攻击,它会诱使用户意外使用其凭证来调用状态更改活动,例如从他们的帐户转移资金、更改他们的电子邮件地址和密码或其他一些不受欢迎的操作。

尽管对普通用户的潜在影响已经很大,但对管理帐户的成功 CSRF 攻击可能会危及整个服务器,可能导致完全接管 Web 应用程序、API 或其他服务。

跨站点请求伪造如何运作?

此攻击侧重于针对状态更改请求,即导致数据从一个值更改为另一个值的请求类型。例如,有针对性的请求可能会进行购买或更改帐户中的值。有趣的是,这是一种“盲目攻击”,并且不会将数据返回给攻击者,所以这并不是数据盗窃的好选择。

以下是一个跨站点请求伪造攻击的示例,其中包含 4 个步骤:

  1. 攻击者创建一个伪造的请求,该请求在运行时会将 10,000 美元从特定银行转入攻击者的账户。
  2. 攻击者将伪造的请求嵌入到超链接中,以批量电子邮件的形式发送出去,并将其嵌入到网站中。
  3. 受害者点击攻击者放置的电子邮件或网站链接,导致受害者向银行提出转账 10,000 美元的请求。
  4. 银行服务器接收到请求,并且由于受害者得到了适当的授权,它将请求视为合法并转移资金。
伪造的请求

CSRF 攻击在方法上有所不同,但通常具有以下特征:

  1. 它们利用依赖用户身份的网站
  2. 它们欺骗用户的浏览器向目标网站发送 HTTP 请求
  3. 它们涉及使用具有副作用且没有适当的 CSRF 保护的 HTTP 请求

不同的 HTTP 动词遭受 CSRF 攻击的难易程度不同,从而导致了不同的保护策略。这是由于网络浏览器处理动词的方式不同。

HTTP GET 请求具有嵌入的参数,例如图像标签内的参数,这些参数可能被操纵和利用。通常,GET 请求不会修改状态,因此对于正确实施的 Web 应用程序或其他资源,它们无法作为 CSRF 的目标。

HTTP POST 用于更改状态,因此需要更多保护。为此,Web 浏览器实施了称为同源策略 (SOP) 和跨源资源共享 (CORS)(其中包含跨源安全策略) 的安全措施。SOP 只允许来自同一来源的请求,而 CORS 只允许某些类型的请求来自不同的来源。通过限制请求或网页与不同来源交互的能力,这些实施的组合有助于防止 CSRF 攻击(以及其他攻击)。

其他 HTTP 动词(例如 PUT 和 DELETE)只能使用 SOP 和 CORS 运行,从而减轻许多跨站点攻击。

虽然不常见,但一些网站会明确禁用这些安全措施,也可能在 Web 浏览器中禁用它们。

如何缓解跨站点请求伪造?

缓解 CSRF 攻击的最常见方法是使用两种方法之一的 Anti-CSRF 令牌。虽然令牌实施略有不同,但基本原理保持不变;通过创建然后比较随机生成的令牌字符串,攻击者在没有异常不可能的猜测的情况下,不太可能执行攻击。

同步器令牌模式:

当用户访问网页时,例如允许转账的银行网页,银行的网站会在表单中嵌入一个随机令牌。当用户提交表单时,随机令牌被返回,银行能够检查两个令牌是否匹配。如果令牌匹配,则会转账。攻击者无法访问网页中创建的随机令牌值,如果他们请求该页面,同源策略将阻止攻击者读取响应。

这种方法缓解的缺点是它增加了服务器端检查每个请求的令牌有效性的负担。如果用户有多个浏览器窗口或涉及不同软件发出请求的其他情况,它也会产生问题。通过将令牌的范围扩展到每个会话而不是每个请求,可以避免其中的一些困难。

Cookie-to-header 令牌:

另一种方法涉及向访问者的 Web 浏览器发出包含随机令牌的 cookie。在客户端运行的 JavaScript 将读取 cookie 中令牌的值并将其复制到 HTTP 标头中,该标头将随每个请求一起发送。如果用户发送的是真正的请求,则标头中的值可以由服务器验证。任何其他情况都将失败,从而减少成功的攻击。

通过 WAF 使用自定义规则,用户能够帮助防止某些 CSRF 攻击。探索 Cloudflare 的 Web 应用程序防火墙

*混淆代理问题

混淆代理是指被愚弄而滥用其权限的计算机程序。与此类漏洞相关的风险就是为什么基于能力的安全性有助于降低与滥用相关的风险。例如,在安装软件时,如今的大多数计算机都要求用户登录。这有助于防止在用户意外使用其权限授权安装时无意间执行代码。