什么是 CSRF

CSRF(Cross-Site Request Forgery,跨站请求伪造)

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

关键点

  • 利用了用户的 身份认证状态(如 Cookie)。
  • 攻击者诱导用户点击链接或加载页面/图片,即可悄无声息发起请求。
  • 如果服务器没有做好防护,攻击请求将被认为是合法用户操作。

原因

  • 浏览器默认会携带 Cookie:即使页面是第三方站点。
  • 用户通常 不会频繁退出登录
  • 请求没有必要的验证机制(如 CSRF Token)。

CSRF 的攻击原理

设想一个网站 bank.com 有如下请求:

1
2
3
4
POST /transfer
Host: bank.com
Cookie: session=abc123
Body: to=attacker&amount=1000

攻击者构造一个页面如下:

1
<img src="http://bank.com/transfer?to=attacker&amount=1000" />

用户在登录 bank.com 后,没有退出登录,访问了攻击者网页,浏览器自动携带 bank.com 的 Cookie,服务器认为是合法请求,从而转账成功。


CSRF 的典型攻击方式

  1. GET 请求注入

    1
    <img src="http://target.com/delete?id=123" />
  2. 表单自动提交(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
2
3
4
5
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="random_token_here">
<input name="to" value="">
<input name="amount" value="">
</form>

2. 验证 HTTP Referer

检查请求来源,确保请求来自合法域名。

设置 Cookie 的 SameSite 属性:

1
Set-Cookie: session=abc123; SameSite=Strict

将 Token 同时放在 Cookie 和请求参数中,服务器比较两者是否一致。


总结

CSRF 攻击利用了浏览器自动携带 Cookie 的特性,通过伪造用户请求来执行恶意操作。有效的防护需要综合使用多种技术手段,最重要的是使用 CSRF Token 和合理设置 Cookie 属性。