CSRF 攻击原理详解:为什么登录态会成为攻击入口

在 Web 安全领域,SQL 注入、XSS 和 CSRF 并称为最常见的三大 Web 攻击方式。相比 SQL 注入直接窃取数据库、XSS 直接盗取用户 Cookie,CSRF(Cross-Site Request Forgery,跨站请求伪造)显得更加“隐蔽”——攻击者并不需要直接获取用户的任何敏感数据,而是借助用户自身的登录态,以用户的名义悄无声息地完成一次恶意操作。本文将从原理出发,解释为什么登录态会成为 CSRF 攻击的入口,并给出对应的安全加固思路。

一、什么是 CSRF

CSRF 是一种诱骗受害者在其已登录的 Web 应用中执行非本意操作的攻击方式。经典定义是:攻击者构造一个恶意页面,当已登录目标站点的用户访问该页面时,浏览器会自动携带该站点的 Cookie 向目标站点发起请求,从而在用户毫不知情的情况下完成转账、改密、发帖、加好友等操作。

理解 CSRF 的关键在于两点:

  1. 浏览器对 Cookie 的发送是自动的,只要请求的目标域名匹配,Cookie 就会被附带上;
  2. 服务器无法仅凭 Cookie 判断这个请求究竟来自用户本人的主动操作,还是来自第三方页面的伪造请求。

二、CSRF 的攻击流程

一个典型的 CSRF 攻击通常包含以下步骤:

  1. 用户登录目标站点,例如网上银行 bank.com,服务器下发会话 Cookie,浏览器保存;
  2. 用户未退出登录,在同一浏览器中访问了攻击者控制的页面 evil.com
  3. 恶意页面中包含一个指向 bank.com 的请求,例如一张图片、一个表单或一段脚本;
  4. 浏览器自动携带 bank.com 的 Cookie 向该站点发起请求;
  5. 服务器验证 Cookie 有效,认为是用户本人操作,执行了转账等敏感动作;
  6. 用户全程无感知,攻击完成。

三、为什么登录态会成为攻击入口

很多开发者会疑惑:攻击者拿不到我的 Cookie,为什么能冒充我?这正是 CSRF 的“精髓”所在——攻击者不需要拿到 Cookie,只需要让浏览器替我发送 Cookie

1. Cookie 的自动携带机制

HTTP 是无状态协议,服务器为了识别用户身份,普遍依赖 Cookie 中的 Session ID。浏览器在发送请求时,只要目标域名与 Cookie 的域匹配,就会自动附带该 Cookie,不区分请求是由哪个页面发起的。这意味着,来自 evil.com 的请求同样会带上 bank.com 的 Cookie。

2. 同源策略的“盲区”

同源策略(Same-Origin Policy)限制了脚本读取跨域响应内容,但并不阻止跨域发起请求。也就是说,evil.com 无法读取 bank.com 的返回内容,但完全可以向 bank.com 发送请求。对于 CSRF 而言,攻击者根本不关心响应,只要请求被服务器执行即可。

3. 服务端身份验证的单一依赖

如果服务器仅依赖 Cookie 中的 Session 来判断用户身份,而不校验请求来源或其他附加凭证,那么任何携带合法 Session 的请求都会被当作合法操作。这正是登录态成为攻击入口的根本原因:身份凭证被自动携带,而请求本身缺乏“是否出自用户本意”的证明

4. 用户行为的不可控性

用户往往在登录状态下浏览各类网站,且不会主动退出登录。攻击者只需诱导用户点击一个链接、加载一张图片,甚至只是在论坛中嵌入一段 HTML,就可能触发请求。这种低成本、高隐蔽的特性,使 CSRF 成为一种极具威胁的攻击方式。

四、常见的 CSRF 攻击载体

  • GET 型请求:如 <img src="https://bank.com/transfer?to=attacker&amount=1000">,页面加载即触发;
  • POST 型请求:通过隐藏表单自动提交,如 <form action="..." method="POST"> 配合 onload 自动提交;
  • XHR / Fetch:受同源策略限制,通常无法携带自定义头,但在某些配置下仍可利用;
  • JSONP、Flash 等历史载体:随着技术演进逐渐减少,但原理相通。

五、CSRF 与 XSS 的区别

两者常被混淆,但本质不同:

  • XSS 利用的是用户对站点的信任,攻击者注入脚本,直接窃取 Cookie 或篡改页面;
  • CSRF 利用的是站点对用户浏览器的信任,攻击者借用户之手发起请求。

简言之,XSS 是“偷走你的身份”,CSRF 是“借用你的身份”。XSS 可以绕过大多数 CSRF 防御,因此在安全加固中,两者需要同时防范。

六、安全加固建议

针对 CSRF,业界已经形成了一套成熟的防御体系:

  1. CSRF Token:在表单或请求中附带一个随机、不可预测的 Token,服务端校验其有效性。由于攻击者无法读取该 Token,伪造请求就会失败。这是目前最主流的防御手段。
  2. SameSite Cookie:将 Cookie 设置为 SameSite=LaxStrict,限制跨站请求携带 Cookie。Lax 模式下,跨站的 POST 请求不会携带 Cookie,能有效阻断大部分 CSRF。
  3. 校验 Referer / Origin:检查请求头中的来源,拒绝来自非信任域的请求。注意 Referer 可能被隐私设置屏蔽,Origin 相对更可靠。
  4. 关键操作二次验证:对转账、改密等敏感操作,要求输入密码、验证码或进行短信验证,增加攻击成本。
  5. 避免使用 GET 执行敏感操作:所有写操作应使用 POST,并配合 Token 校验。
  6. 防御 XSS:防止因 XSS 导致 Token 被窃取,从而绕过 CSRF 防护。

七、总结

CSRF 之所以危险,不在于攻击技术多么复杂,而在于它精准地利用了 Web 的身份认证机制——浏览器自动携带 Cookie,服务端依赖 Cookie 识别身份,而请求本身无法证明是否出自用户本意。登录态因此成为攻击者最理想的“入口”。理解这一原理后,防御思路也就清晰了:让请求本身携带只有用户才能提供的凭证(Token),或限制 Cookie 的跨站携带(SameSite),并对关键操作增加额外验证。只有将 CSRF 防护与 XSS 防御、输入校验、权限控制等措施结合,才能构建起完整的 Web 安全防线。

未经允许不得转载:任鹏个人博客 » CSRF 攻击原理详解:为什么登录态会成为攻击入口

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏