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 |
影响 | 未授权操作 | 数据泄露、身份盗用等 |
防御点 | 验证请求来源 | 过滤/转义用户输入 |
如何防御 CSRF?
-
CSRF Token(推荐)
-
每次表单/请求附加一个服务器生成的随机令牌。
-
后端验证该 Token 是否匹配。
-
示例:
1
<input type="hidden" name="csrf_token" value="random123" />
-
-
SameSite Cookie 属性
-
设置 Cookie 的 SameSite 为
Strict
或Lax
,防止第三方网站自动携带 Cookie。 -
示例:
1
Set-Cookie: sessionid=xyz; SameSite=Strict
-
-
Referer / Origin 检查
- 检查请求头中
Referer
或Origin
是否来自合法域名。 - 缺点:Referer 可能被禁用,兼容性差。
- 检查请求头中
-
双重 Cookie 验证(Double Submit Cookie)
- 在 Cookie 和请求体中分别携带同一个 Token,服务端验证二者一致。
-
用户行为验证
- 添加验证码(CAPTCHA)、点击确认弹窗等方式,增加用户操作成本。