CSRF
本文约需 2 分钟阅读
CSRF (Cross-Site Request Forgery,跨站请求伪造) 是指攻击者诱使用户向其已认证的 Web 服务发送攻击者所设计的非法请求的攻击。由于它滥用了用户登录中的服务的认证信息 (Cookie),请求会被当作用户本人操作一样进行处理。它与 XSS 并列,是具有代表性的 Web 应用程序攻击。截至 2025 年,主流框架 (Django、Rails、Next.js) 已默认内置 CSRF 防护,但 API 端点和 SPA 中的实现遗漏仍不断被报告。
容易出现防护遗漏的位置
CSRF 防护往往在登录、转账等显眼的功能上有所实现,却在收货地址变更、邮箱变更等单个设置变更 API 上出现遗漏。框架默认保护的主要是经由表单的提交,后来追加的 API 端点若开发者不显式加以防护,就可能处于无防备状态。防护有无从页面外观上看不出来,因此漏洞诊断会逐一检查会改变状态的请求,把遗漏排查出来。即便是看似不起眼的功能的 API,也可能成为攻击者改写登录中用户设置的入口,不容忽视。
CSRF 攻击的流程
CSRF 的攻击机制
攻击者会准备一个作为陷阱的 Web 页面,并在其中嵌入对用户登录中服务的请求。例如,在登录银行网站的状态下浏览攻击者的页面,浏览器就会自动向银行网站发送转账请求。由于浏览器会自动发送 Cookie,银行网站一方无法将其与正规用户发出的请求区分开来。
实际的受害场景
有这样的案例:在登录电商网站的状态下,点击攻击者预先植入的链接,收货地址就会被改成攻击者的地址。此外,也有报告称在登录社交网络时浏览陷阱页面,结果导致非本意的发帖或关注。当它与会话劫持相结合时,危害会进一步加剧。在网上银行中,针对转账操作的 CSRF 防护尤为重要。
防御手法
在开发者一侧,标准做法是将 CSRF 令牌 (随机的唯一值) 嵌入表单,并在请求时进行验证。通过设置 SameSite Cookie 属性,可以限制跨站点的 Cookie 发送。在用户一侧,基本做法是养成在重要操作后退出登录的习惯,并且不点击可疑链接。用强力的随机密码保护账户,并启用多因素认证,可以减轻万一发生时的损害。
这篇文章对您有帮助吗?