平时登录各类网站后,无需重复输入账号密码就能正常使用,这一便捷体验全都依靠 Cookie 实现。但 Cookie 在提升使用体验的同时,也存在安全漏洞,极易被不法分子利用,冒用用户身份发起非法请求。本文用通俗易懂的语言讲解 Cookie 运行逻辑,深度拆解跨站请求伪造攻击流程,同时分别给出普通用户与开发人员对应的安全防御办法。
一、网站为何需要 Cookie?通俗理解无状态协议
我们可以用生活场景简单类比,出入游泳馆需要佩戴专属手牌核验身份,凭借手牌即可开启储物柜,无需反复核对个人信息。
网络访问也是同理,账号密码是原始身份凭证,频繁输入十分繁琐,而 HTTP 协议本身属于无状态协议,服务器不会自动留存用户访问记录,用户每发起一次访问请求,服务器都需要重新核验身份。
为解决反复验证身份的繁琐问题,Cookie 机制应运而生,专门用于留存用户登录状态。
二、Cookie 完整运行流程
用户提交账号密码完成登录
用户在登录页面填写账号密码,提交登录请求。
服务器核验信息并生成会话标识
服务器核对账号密码无误后,生成唯一随机字符串,也就是会话 ID,作为用户专属身份凭证。
服务器通过响应头部下发 Cookie
服务器将会话 ID 写入 HTTP 响应头的 Set-Cookie 字段,发送至用户浏览器。
浏览器本地保存 Cookie 数据
浏览器自动接收并存储对应网站的 Cookie,可在浏览器开发者工具中查看。
后续访问自动携带 Cookie
用户再次浏览该网站任意页面时,浏览器会自动携带本地存储的 Cookie 发起访问请求。
服务器核验 Cookie 确认身份
服务器读取请求内的 Cookie 信息,匹配对应的会话记录,确认用户身份后直接返回用户专属页面内容,全程无需二次登录。
Cookie 既简化了用户操作,也方便开发者记录用户使用偏好,但也埋下了网络安全隐患。
三、CSRF 攻击核心原理
很多人误以为攻击者需要窃取用户 Cookie 才能实施攻击,实则并非如此。
浏览器遵循域名隔离规则,不同网站的 Cookie 相互独立隔离,A 网站无法读取 B 网站的 Cookie 数据,这是浏览器基础安全机制。
而 CSRF 攻击的核心漏洞在于:浏览器会自动向对应域名网站携带本地存储的 Cookie。
简单来说,只要用户浏览器内留存了某网站的登录 Cookie,无论请求由哪个页面发起,只要目标地址匹配域名,浏览器都会自动附上 Cookie 完成身份核验。
攻击者无需盗取用户 Cookie,只需诱导用户访问植入恶意代码的页面,借助用户浏览器自动携带 Cookie 的特性,代为发起非法请求,完成身份冒用。
四、实战演示 CSRF 攻击全过程
用户保持网站登录状态
用户正常登录社交、购物、理财等网站,浏览器留存登录 Cookie。
攻击者抓取网站可篡改接口
攻击者自行登录同款网站,抓取修改资料、转账、改密码、发布内容等高危操作的请求接口、请求方式以及提交参数。
编写恶意伪装请求页面
攻击者搭建恶意网页,隐藏表单提交模块,填充伪造请求参数,设置页面加载后自动提交请求。
诱导用户访问恶意页面
通过陌生链接、弹窗广告、趣味图文等形式,引诱处于登录状态的用户点击访问恶意网页。
攻击执行完成非法操作
用户打开恶意页面后,隐藏表单自动提交请求,浏览器自动携带用户登录 Cookie 发送至目标网站。服务器核验 Cookie 判定为合法用户,顺利执行篡改信息、资金变动等非法操作,攻击就此成功。
五、CSRF 名称详细释义
1. 请求伪造
攻击者发起的请求并非用户自主操作,而是借助恶意代码强制触发,请求格式、身份凭证均完全合规,服务器无法自主辨别请求真实性,仅依靠 Cookie 判定用户身份。
2. 跨站发起
正常操作均为站内发起请求,而 CSRF 攻击属于跨站请求,用户停留在恶意网站页面,请求却定向发送至已登录的正规网站,跨站发起是该攻击最核心的特征。
3. 跨站请求伪造
整合含义即为:攻击者借助第三方恶意站点,伪造用户操作请求,跨站点冒用用户身份,在用户不知情的情况下执行各类高危操作。
六、普通用户简易防御手段
- 拒绝点击来路不明的网址链接、陌生弹窗以及非正规渠道分享的网页。
- 重要金融、办公类网站,尽量使用专属浏览器登录,不混用浏览器浏览娱乐网页。
- 网页使用完毕后及时退出登录,清空登录状态,清除本地留存的会话 Cookie。
- 避免同时在同一浏览器中,登录多个高权限、高资产类账号。
多数用户日常很难严格遵守以上规范,因此网络安全防护的核心责任,主要由网站开发人员承担。
七、开发人员主流防御方案
防御 CSRF 攻击的核心思路:阻断跨站自动核验身份的漏洞,让服务器能够精准区分用户自主请求与伪造非法请求。
方案一:部署 CSRF 令牌防护
这是行业内最通用、最稳妥的防御方式。在网站所有提交表单、接口请求中,加入后端动态生成的随机唯一令牌。令牌由服务器根据当前登录用户实时生成,每位用户令牌互不相同,且实时动态更新。
用户正常提交操作时,请求会同步携带专属令牌,服务器核验令牌与用户身份匹配后,才会执行对应操作。
攻击者无法获取用户实时专属令牌,伪造的恶意请求缺少有效令牌,会直接被服务器拦截拒绝,彻底杜绝伪造请求生效。
Cookie 由浏览器自动携带传输,无法人为管控,而 CSRF 令牌必须手动随表单提交,跨站恶意页面无法获取合法令牌,从根源封堵攻击路径。
方案二:配置 SameSite Cookie 属性
该方案直接从浏览器层面限制 Cookie 跨站传输,配置方式简单高效。在服务器下发 Cookie 时,添加 SameSite 属性,明确限定 Cookie 的传输规则。
Strict 严格模式
全面禁止 Cookie 跟随跨站请求传输,彻底拦截所有 CSRF 攻击,安全等级最高,缺点是部分跨站跳转登录场景会影响使用体验。
Lax 宽松模式
仅允许安全的 GET 类型跨站请求携带 Cookie,拦截 POST 提交类高危篡改请求,兼顾安全性与日常使用体验,也是目前最常用的配置模式。
None 无限制模式
开放所有场景 Cookie 跨站传输,必须搭配 Secure 属性使用,仅支持 HTTPS 加密网络环境传输 Cookie,仅适用于第三方登录、网页内嵌等特殊业务场景。
配置完成后,跨站恶意请求将无法携带登录 Cookie,服务器无法完成身份核验,攻击直接失效。
方案三、辅助加固防御手段
校验请求来源地址,核对请求头部的来源域名与访问地址。规范接口请求方式,高危修改类操作统一禁用 GET 请求。启用跨域资源共享策略,限制非法域名访问网站接口。
八、全文总结
Cookie 用于留存用户登录状态,依靠自动携带特性实现免密访问,也是 CSRF 攻击得以实施的基础条件。
跨站请求伪造攻击,依靠诱导用户访问恶意页面,借助浏览器自动携带 Cookie 的漏洞,冒用用户身份执行非法操作。
普通用户以养成安全上网习惯为主,不轻信陌生链接,及时退出账号登录。
网站开发优先采用 CSRF 令牌搭配 SameSite Cookie 双重防护,多层拦截伪造请求,筑牢网站安全防线。
合理设置 Cookie 属性、规范接口请求规则,能够最大程度降低 CSRF 攻击带来的账号被盗、信息篡改、财产损失等安全风险。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2695.html
