CSRF
什么是 CSRF
CSRF(Cross-Site Request Forgery,跨站请求伪造)
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
关键点
- 利用了用户的 身份认证状态(如 Cookie)。
- 攻击者诱导用户点击链接或加载页面/图片,即可悄无声息发起请求。
- 如果服务器没有做好防护,攻击请求将被认为是合法用户操作。
原因
- 浏览器默认会携带 Cookie:即使页面是第三方站点。
- 用户通常 不会频繁退出登录。
- 请求没有必要的验证机制(如 CSRF Token)。
CSRF 的攻击原理
设想一个网站 bank.com 有如下请求:
1 | POST /transfer |
攻击者构造一个页面如下:
1 | <img src="http://bank.com/transfer?to=attacker&amount=1000" /> |
用户在登录 bank.com 后,没有退出登录,访问了攻击者网页,浏览器自动携带 bank.com 的 Cookie,服务器认为是合法请求,从而转账成功。
CSRF 的典型攻击方式
GET 请求注入:
1
<img src="http://target.com/delete?id=123" />
表单自动提交(POST):
1
2
3
4
5
6<form action="http://target.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="1000">
<input type="submit">
</form>
<script>document.forms[0].submit();</script>
CSRF 与 XSS 的区别
| 方面 | CSRF | XSS |
|---|---|---|
| 攻击者 | 第三方网站 | 插入恶意脚本到目标站点 |
| 原理 | 利用用户身份 | 利用浏览器执行恶意 JS |
| 影响 | 冒充用户操作 | 窃取信息、劫持会话 |
防护措施
1. CSRF Token
服务器为每个表单生成唯一的 Token,提交时验证:
1 | <form action="/transfer" method="POST"> |
2. 验证 HTTP Referer
检查请求来源,确保请求来自合法域名。
3. SameSite Cookie
设置 Cookie 的 SameSite 属性:
1 | Set-Cookie: session=abc123; SameSite=Strict |
4. 双重 Cookie 验证
将 Token 同时放在 Cookie 和请求参数中,服务器比较两者是否一致。
总结
CSRF 攻击利用了浏览器自动携带 Cookie 的特性,通过伪造用户请求来执行恶意操作。有效的防护需要综合使用多种技术手段,最重要的是使用 CSRF Token 和合理设置 Cookie 属性。






