在 Web 安全领域,SQL 注入、XSS 和 CSRF 并称为最常见的三大 Web 攻击方式。相比 SQL 注入直接窃取数据库、XSS 直接盗取用户 Cookie,CSRF(Cross-Site Request Forgery,跨站请求伪造)显得更加“隐蔽”——攻击者并不需要直接获取用户的任何敏感数据,而是借助用户自身的登录态,以用户的名义悄无声息地完成一次恶意操作。本文将从原理出发,解释为什么登录态会成为 CSRF 攻击的入口,并给出对应的安全加固思路。
一、什么是 CSRF
CSRF 是一种诱骗受害者在其已登录的 Web 应用中执行非本意操作的攻击方式。经典定义是:攻击者构造一个恶意页面,当已登录目标站点的用户访问该页面时,浏览器会自动携带该站点的 Cookie 向目标站点发起请求,从而在用户毫不知情的情况下完成转账、改密、发帖、加好友等操作。
理解 CSRF 的关键在于两点:
- 浏览器对 Cookie 的发送是自动的,只要请求的目标域名匹配,Cookie 就会被附带上;
- 服务器无法仅凭 Cookie 判断这个请求究竟来自用户本人的主动操作,还是来自第三方页面的伪造请求。
二、CSRF 的攻击流程
一个典型的 CSRF 攻击通常包含以下步骤:
- 用户登录目标站点,例如网上银行
bank.com,服务器下发会话 Cookie,浏览器保存; - 用户未退出登录,在同一浏览器中访问了攻击者控制的页面
evil.com; - 恶意页面中包含一个指向
bank.com的请求,例如一张图片、一个表单或一段脚本; - 浏览器自动携带
bank.com的 Cookie 向该站点发起请求; - 服务器验证 Cookie 有效,认为是用户本人操作,执行了转账等敏感动作;
- 用户全程无感知,攻击完成。
三、为什么登录态会成为攻击入口
很多开发者会疑惑:攻击者拿不到我的 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,业界已经形成了一套成熟的防御体系:
- CSRF Token:在表单或请求中附带一个随机、不可预测的 Token,服务端校验其有效性。由于攻击者无法读取该 Token,伪造请求就会失败。这是目前最主流的防御手段。
- SameSite Cookie:将 Cookie 设置为
SameSite=Lax或Strict,限制跨站请求携带 Cookie。Lax模式下,跨站的 POST 请求不会携带 Cookie,能有效阻断大部分 CSRF。 - 校验 Referer / Origin:检查请求头中的来源,拒绝来自非信任域的请求。注意 Referer 可能被隐私设置屏蔽,Origin 相对更可靠。
- 关键操作二次验证:对转账、改密等敏感操作,要求输入密码、验证码或进行短信验证,增加攻击成本。
- 避免使用 GET 执行敏感操作:所有写操作应使用 POST,并配合 Token 校验。
- 防御 XSS:防止因 XSS 导致 Token 被窃取,从而绕过 CSRF 防护。
七、总结
CSRF 之所以危险,不在于攻击技术多么复杂,而在于它精准地利用了 Web 的身份认证机制——浏览器自动携带 Cookie,服务端依赖 Cookie 识别身份,而请求本身无法证明是否出自用户本意。登录态因此成为攻击者最理想的“入口”。理解这一原理后,防御思路也就清晰了:让请求本身携带只有用户才能提供的凭证(Token),或限制 Cookie 的跨站携带(SameSite),并对关键操作增加额外验证。只有将 CSRF 防护与 XSS 防御、输入校验、权限控制等措施结合,才能构建起完整的 Web 安全防线。
未经允许不得转载:任鹏个人博客 » CSRF 攻击原理详解:为什么登录态会成为攻击入口


朋友圈点赞图在线生成源码