跨站请求伪造
1. 什么是 CSRF?
CSRF,全称为 Cross-Site Request Forgery,中文是 跨站请求伪造。它通常被缩写为 CSRF 或 XSRF,读作 “Sea-Surf”。
核心概念:
攻击者欺骗用户的浏览器,让其以一个已登录用户的身份,在用户不知情的情况下,向一个目标网站发送一个恶意请求。
简单比喻:
你登录了网上银行(相当于拿到了银行的“临时通行证”)。这时,一个坏人给你发了一个链接,你点击后,这个链接其实是一个“自动提交的转账表单”,它利用你浏览器里已有的“临时通行证”,成功执行了转账操作。你的浏览器“代表”你发出了这个请求,银行认为这是你的合法操作。
2. CSRF 的攻击原理与流程
要成功发起 CSRF 攻击,必须同时满足以下三个条件:
- 用户已经登录了目标网站(如银行、邮箱、社交网络),并在浏览器中保持了登录状态(Session 未过期)。
- 用户访问了恶意攻击者精心构造的页面(如钓鱼邮件中的链接、恶意网站)。
- 目标网站没有对敏感请求进行有效的 CSRF 防护。
攻击流程示意图:

举个例子:
- 小明登录了
bank.com,浏览器保存了他的登录 Cookie。 - 小明收到一封邮件,里面有一个链接,他好奇地点开了,进入了攻击者控制的网站
evil.com。 evil.com的页面上有一个隐藏的 HTML 表单,它会自动向bank.com的转账接口提交请求。<form action="https://bank.com/transfer" method="POST" id="csrf-form"><input type="hidden" name="toAccount" value="hacker"><input type="hidden" name="amount" value="100000"> </form> <script>document.getElementById('csrf-form').submit();</script>- 小明的浏览器在向
bank.com发送这个 POST 请求时,会自动携带bank.com的登录 Cookie。 bank.com服务器收到请求,验证 Cookie 有效,认为是小明本人操作的,于是成功将 100,000 元转给了 hacker。
3. CSRF 的特点
- 利用的是网站的信任:网站信任用户浏览器发出的、带有正确 Session Cookie 的请求。
- 受害者是用户:攻击的最终受害者是用户,但漏洞的根源在于目标网站。
- 攻击者无法直接获取 Cookie:与 XSS 不同,CSRF 攻击中,攻击者并不知道用户的 Cookie 内容,他只是利用了浏览器自动发送 Cookie 的机制。
- 请求是“合法”的:从服务器的日志看,这个请求和用户正常操作的请求几乎没有区别。
4. 如何防御 CSRF
防御的核心思想是:“增加一个攻击者无法伪造的、不属于浏览器自动发送机制的凭证。”
1. 同源策略检查
- 原理:浏览器会阻止一个源的脚本访问另一个源的资源。但这并不能阻止 img、form 等标签发起的跨域请求。
- 方法:服务器验证
Origin或Referer请求头,检查请求是否来自合法的源(域名)。但某些情况下Referer可能被禁用或不发送。
2. CSRF Tokens(最常用、最有效的方法)
- 原理:在用户会话中生成一个随机的、不可预测的令牌,并将其嵌入到表单或请求参数中。当服务器收到敏感请求时,会校验这个令牌是否与会话中保存的一致。
- 流程:
- 用户访问一个包含表单的页面时,服务器生成一个随机 Token,放在表单的隐藏域和用户的 Session 里。
- 用户提交表单时,这个 Token 会随着表单数据一起提交。
- 服务器比对表单中的 Token 和 Session 中的 Token,一致则通过,不一致则拒绝。
- 为何有效:攻击者无法提前知晓或预测这个 Token,因此他构造的恶意请求中无法包含正确的 Token。
3. 双重 Cookie 验证
- 原理:将 Cookie 中的某个值(如
__csrf)也作为请求参数发送。服务器校验参数中的值和 Cookie 中的值是否一致。 - 为何有效:攻击者可以诱导用户发送 Cookie,但他无法读取到 Cookie 的内容(因为同源策略),因此他无法将正确的 Cookie 值作为参数放入请求中。
4. SameSite Cookie 属性(现代浏览器的利器)
- 原理:这是一种由浏览器提供的、从源头解决问题的方案。在设置 Cookie 时,可以指定
SameSite属性。SameSite=Strict:最严格,完全禁止第三方 Cookie。用户从evil.com链接点击到bank.com,浏览器也不会发送 Cookie。SameSite=Lax:宽松模式,对于安全的 HTTP 方法(如 GET)允许在跨站跳转时携带 Cookie,但对于不安全的(如 POST)则禁止。这是目前很多站点的默认选择。SameSite=None:无限制,但必须与Secure属性(仅限 HTTPS)一同使用。
总结
| 特性 | 描述 |
|---|---|
| 攻击名称 | CSRF(跨站请求伪造) |
| 攻击目标 | 利用用户的登录状态,以用户名义执行非自愿操作 |
| 核心漏洞 | 网站完全信任来自浏览器、带有正确 Session Cookie 的请求 |
| 防御核心 | 增加攻击者无法伪造的凭证 |
| 最佳实践 | CSRF Token + SameSite Cookie 属性 组合使用 |
