一文了解 CSRF 攻击
2025-09-17
Mozilla 文档是个好东西。
最近在了解 Web 领域里的恶意攻击,发现网上有个系统 指南🔗,Mozilla 官方出品。其中罗列了一种比较有意思的攻击手段:Cross-Site Request Forgery (CSRF),也称“跨站请求伪造”。
之所以说它有意思,是因为它背后的想法。与常规的攻击手段不同,这里的攻击者,其实并没有获取到用户的密码,但银行卡里的钱还是少了,你去找银行,银行说是你“自己”转走的。
CSRF 的原理,就是冒充身份,做一些非用户意愿的事情。
如何冒充,有没有规避手段,对我们有哪些启示,争取用一篇文章说清楚。
1. CSRF 概念
Mozilla 文档中如此描述 CSRF:
In a cross-site request forgery (CSRF) attack, an attacker tricks the user or the browser into making an HTTP request to the target site from a malicious site. The request includes the user’s credentials and causes the server to carry out some harmful action, thinking that the user intended it.
在跨站请求伪造 (CSRF) 攻击中,攻击者会诱骗用户或浏览器从恶意网站向目标网站发出 HTTP 请求。该请求包含用户的凭据,并导致服务器执行某些有害操作,并认为这是用户的意图。
因为请求是从被信任客户端发起,因此更隐蔽,难以防御。
CSRF 攻击通常具有以下特征:
- 用户已经登陆目标网站,登陆信息被保存
- 欺骗用户浏览器,向目标网站发送 HTTP 请求
- 这些 HTTP 请求具有“副作用”,且没有恰当的 CSRF 保护
2. 攻击流程
举个例子。
你在自己的电脑上登陆网银,浏览器保存登陆会话(Session)。
恰好,攻击者在 QQ 群里给你发送了一个链接,里面隐藏着一个看起来其貌不扬的图片:
<img src="https://bank.com/transfer?to=hacker&amount=10000" />你不小心点击了链接,浏览器自动加载图片,它不知道这其实是个伪装的“转账请求”。
由于你之前登陆过网银,请求里附带了银行网站的 Cookie,所以银行以为是你主动发起的,交易完成。
为什么说 CSRF 很危险?
- 隐蔽:用户甚至只是打开链接就可能中招
- 危险:攻击者可能发起转账,修改密码,甚至更加危险的操作
- 范围广:任何依赖 Cookie 的网站都可能被攻击
3. 防御
网站建设者在 CSRF 上吃过不少的亏,因此也研究出不少防御的手段。
比较常见的有四个:
3.1 CSRF Token (最常见)
在表单或请求里添加一个随机的 token,然后在服务端确认,比如:
<input type="hidden" name="csrf_token" value="a9f8b2d1c3" />由于 token 是随机生成的,很难伪造。
3.2 SameSite Cookie
现代浏览器支持为 Cookie 增加 SameSite 属性:
SameSite=Strict:跨站点请求不会带上 CookieSameSite=Lax:部分安全场景下允许(比如 GET 表单)
攻击者发起的跨站请求就拿不到用户的登陆状态了。
3.3 检查 Referer/Origin
服务端可以校验请求头,确认请求是从本站发起,而不是第三方网站。
3.4 二次确认
对于高危操作,可以请求二次确认,比如利用多重要素验证(Multi-factor authentication, MFA)。
4. 总结
第一个想到 CSRF 这种攻击方式的人,一定非常聪明,不仅对整个 Web 架构和运行逻辑十分了解,而且能找到其中的漏洞。
当许多人都还在绞尽脑汁尝试破解用户密码的时候,有的人却另辟蹊径,将用户登陆过的客户端作为攻击的发起对象。
能充分利用规则的,一定是那些深刻理解规则的。很多领域都是这样。
(完)
参考
- 本文作者:Plantree
- 本文链接:https://plantree.me/blog/2025/csrf-attack/
- 版权声明:所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
最后更新于: 2026-01-05T06:49:23+08:00