ZetCode

CSRF (跨站请求伪造)

最后修改于 2025 年 4 月 4 日

CSRF 定义

CSRF (Cross-Site Request Forgery,跨站请求伪造) 是一种 Web 安全漏洞,它允许攻击者诱骗用户在 Web 应用程序中执行非自愿的操作。当恶意网站导致用户浏览器向用户已登录的目标站点发送未经授权的请求时,就会发生这种情况。这些伪造的请求可以执行诸如更改账户详细信息、进行交易或修改数据等操作,而用户对此毫不知情。CSRF 攻击利用的是 Web 应用程序对用户浏览器的信任,而不是用户本身。这使得它与其他攻击(如 XSS,跨站脚本攻击)有所不同。

CSRF 中的“伪造”一词指的是攻击者能够伪造看起来合法的 HTTP 请求发送给服务器。由于浏览器会在每次请求时自动包含 Cookie 和会话信息,因此服务器无法区分Genuine 用户操作和伪造的操作。CSRF 多年来一直位列 OWASP 十大关键 Web 应用程序安全风险列表,这凸显了它对 Web 安全构成的持续威胁。

CSRF 的更广泛背景

CSRF 存在于更广泛的 Web 应用程序安全威胁环境中,与 SQL 注入和 XSS 等漏洞并列。虽然其他攻击侧重于破坏数据或用户会话,但 CSRF 专门针对状态更改操作。对于那些通过简单的 GET 或 POST 请求执行敏感操作而没有额外验证的应用程序来说,CSRF 尤其危险。现代 Web 框架通常包含内置的 CSRF 保护,但开发人员必须理解并正确实施这些机制。

单页应用程序 (SPA) 和 RESTful API 的兴起改变了 CSRF 攻击的表现方式,但并未消除风险。即使 CORS (跨域资源共享) 策略盛行,CSRF 仍然是一个令人担忧的问题,因为它不需要读取响应——只需要发起请求。理解 CSRF 对于前端和后端开发人员都至关重要,因为预防需要客户端和服务器端组件之间的协调。

CSRF 的特点

CSRF 攻击的工作原理

典型的 CSRF 攻击遵循一个特定的序列,该序列利用了浏览器行为和应用程序信任。首先,攻击者识别目标应用程序中易受攻击的操作,例如更改电子邮件或资金转账的端点。然后,他们创建一个包含代码的恶意网页,当用户访问该页面时,该代码会自动向此端点提交一个请求。如果受害者登录了目标站点,他们的浏览器会将会话 Cookie 与此伪造的请求一起发送。

服务器将该请求视为合法,因为它带有有效的身份验证凭据。由于攻击是在后台发生的,用户可能在注意到未经授权的更改之前都不会意识到。下表概述了 CSRF 攻击的关键阶段,从准备到执行,以帮助可视化攻击流程。

阶段 描述
目标识别 攻击者在 Web 应用程序中找到一个没有 CSRF 保护的易受攻击的操作,通常是状态更改操作。
恶意请求伪造 攻击者创建 HTML 或 JavaScript,当在受害者浏览器中执行时,会自动将请求发送到易受攻击的端点。
引诱受害者 攻击者通过网络钓鱼邮件或被入侵的网站等方式,诱骗受害者访问恶意页面。
请求执行 受害者浏览器将伪造的请求发送到目标站点,并附带用户的活动会话 Cookie。
服务器处理 目标服务器将请求视为合法,因为它附带有效的身份验证凭据。

防范 CSRF 攻击

有效的 CSRF 防范需要实施多种安全措施,这些措施共同作用以验证请求的合法性。最常见的方法是使用 CSRF 令牌——服务器生成的、包含在表单或标头中的唯一、不可预测的值。请求的处理必须使这些令牌在客户端和服务器之间匹配。另一种强大的方法是利用 SameSite Cookie 属性,该属性限制何时将 Cookie 与跨站请求一起发送。

其他防御措施包括要求对敏感操作进行重新身份验证、检查 Origin 或 Referer 标头以及为 API 请求实现自定义标头。Django、Rails 和 Spring Security 等现代 Web 框架提供了内置的 CSRF 保护,开发人员应启用并正确配置这些保护。关键在于采取纵深防御策略,而不是依赖单一解决方案,因为每一层都为不断演变的攻击技术提供了额外的安全性。

CSRF 防护技术

来源

OWASP CSRF

在本文中,我们深入探讨了 CSRF (跨站请求伪造),探讨了它的定义、背景、特点、攻击方法、预防和防护技术。本综合指南为读者提供了理解和防御 Web 应用程序中 CSRF 漏洞所需的知识。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章,分享关于语言、框架和最佳实践的见解。至今,我已撰写了 1,400 多篇文章和 8 本电子书,涵盖了从初学者教程到高级开发技术的各种主题。凭借十多年的编程教学经验,我努力使复杂概念对学习者和专业人士来说都易于理解和实用。

所有安全术语列表。