FullStory、Hotjar 等会话回放工具会记录你的鼠标、按键和滚动操作。了解其工作原理、如何识别,以及如何降低风险。
没错——越来越多的网站会运行会话回放脚本(session replay scripts),悄悄记录你的鼠标移动、按键、点按和滚动操作,让后台的某个人日后能像看视频一样回放你的整个访问过程。这类工具中最知名的是 FullStory 和 Hotjar,它们对外宣称是用户体验分析工具,但在默认配置下,它们记录的远不止点击和页面浏览量:它们几乎可以重建你在页面上做的所有事情,有时甚至包括你输入到网站本不该暴露的字段中的文字。
关键要点
- 会话回放脚本(FullStory、Hotjar 及类似工具)会记录鼠标移动、按键、点按、滚动和 DOM 变化,以重建你的访问"回放"。
- 它们的原理是给输入、鼠标和滚动事件绑定监听器,并观察 DOM 变化——这与任何页面都能使用的浏览器 API 相同,只是被用来监视而非实现功能。
- 大多数实现中,记录默认是"选择退出"(opt-out)而非选择加入:网站必须主动屏蔽敏感字段,而多次审计都发现这种屏蔽并不完整。
- 你通常可以通过检查页面加载的脚本和网络请求中是否有已知供应商域名,或留意每次按键都触发的异常频繁的信标流量,来发现会话回放的存在。
- 内容拦截器、脚本拦截扩展,以及对不熟悉的网站禁用 JavaScript,都能减少暴露;但没有一个万能开关能让你在所有网站上都退出。
会话回放究竟记录了什么
会话回放脚本不只是统计页面浏览量——它在构建一段录像。根据配置的不同,它可以捕获:
- 鼠标移动和点击——你光标经过的确切路径,包括你从未点击过但悬停过的元素
- 按键和表单输入——输入到文本字段中的字符,有时在你提交表单之前就已被记录
- 滚动和视口变化——你滚动了多远、停留了多久,以及每一刻屏幕上显示的内容
- DOM 变化——随着你与页面互动,元素的出现、消失或变化,让工具能够逐帧重建页面的视觉状态
综合这些信号,分析人员(或自动化仪表盘)就能拖动时间轴,几乎完全按照你当时的体验重新观看你的会话——连光标动作都不放过。
FullStory 和 Hotjar 类工具的工作原理
会话回放供应商会提供一小段 JavaScript 代码片段,网站将其加入每个页面,方式与添加 Google Analytics 相同。加载后,该脚本会给标准浏览器事件(mousemove、keydown、scroll、input)绑定监听器,并使用 MutationObserver 这类观察者 API 监视 DOM 变化。这一切都不需要任何特殊的浏览器权限——它只是每个交互式网页早已依赖的同一套事件模型,只是被接上了记录功能而非用来渲染某个特性。
捕获的事件会被批量发送回供应商的服务器,在那里被重新组装成可拖动播放的"回放"——本质上是一段由原始交互数据合成出来的视频,而非真实像素录制。大多数供应商都提供了一套遮罩(masking)API,让网站可以把特定字段(比如信用卡号)标记为"不记录",但这种遮罩必须由集成脚本的人逐字段主动配置才能生效。根据 EFF 对企业监控技术的研究,会话回放工具多次被发现泄露了本应由遮罩保护的数据——包括医疗信息、信用卡号和密码——原因是过滤敏感字段这件事"细致、繁琐、耗时",网站经常做错,或者干脆跳过不做。
如何在页面上检测会话回放脚本
你不需要特殊工具就能发现大多数会话回放的接入痕迹——只要知道去哪里看。
- 检查页面的脚本来源。 打开浏览器开发者工具,切到 Network 标签页并刷新页面,查找发往已知会话回放域名的请求(FullStory 通常从
fullstory.com加载,Hotjar 则从hotjar.com或static.hotjar.com加载)。指向这类域名的脚本标签就是强烈的信号。 - 留意每次按键或每次移动都触发的网络流量。 会话回放脚本经常在你与页面互动时批量发送并刷新一个个小的 POST 请求。如果你发现每次移动鼠标或打字都有持续不断的外发请求,这与回放式记录相符,而普通分析工具通常每次页面浏览只发一次请求。
- 检查全局变量。 许多会话回放代码片段会在
window上挂载一个可识别的对象(例如某个供应商专属的命名空间)。页面加载后在控制台中输入该供应商预期的全局变量名,可以确认该库是否存在。 - 查看页面源代码中的加载脚本。 和大多数第三方脚本一样,会话回放的加载器通常以一小段内联
<script>代码块的形式插入到页面顶部——即使页面尚未渲染,在"查看页面源代码"中也能看到。
单独来看,这些检查都不是万无一失的——网站可以自行托管或重命名脚本,让它更难被一眼看出——但综合运用,它们能覆盖绝大多数真实存在的部署,因为多数网站基本上是直接使用供应商提供的脚本。
隐私风险与缓解措施
核心风险不在于会话回放这项技术本身存在——许多合规的用户体验研究确实依赖它——而在于记录默认是"选择退出"而非"选择加入",而且正确配置脚本以保护敏感数据的责任完全落在配置脚本的人身上。开发者忘记遮罩的某个表单字段、密码管理器在遮罩规则生效前就自动填充了内容,或客服人员在拖动回放时恰好看到一个先打错又改正的信用卡号——这些都是真实发生过的失效场景,而非假设情形。
以下几个实际做法可以降低你的暴露风险:
- 使用内容拦截扩展。 大多数广告和追踪拦截器维护的过滤列表已经包含了主要会话回放供应商的域名,能在脚本绑定任何监听器之前就将其拦截。
- 在条件允许的情况下,对不信任的网站禁用 JavaScript——会话回放完全依赖客户端脚本执行,没有 JavaScript 就没有备用记录途径。
- 在包含敏感数据的表单上保持谨慎。 如果网站的某些行为(实时输入预览、异常延迟)让你怀疑有东西在实时监视输入,就避免输入你不希望被逐字保存的敏感信息。
- 检查自己的暴露情况。 BrowserInsight 的浏览器扩展与脚本检测可以帮你发现浏览器会话中正在运行的活跃脚本和插件,我们的浏览器扩展隐私指南则从另一个角度介绍了扩展读取同样这些数据的平行风险。
综合来看
会话回放很好地说明了一个浏览器功能完全按照设计运行、却仍然造成真实隐私问题的案例:mousemove 监听器或 MutationObserver 本身并无恶意,但当它们被用在未做遮罩的表单字段上、并把数据发送给第三方时,汇总起来的结果就是一段你从未明确同意过的会话记录。它与我们机器人检测技术指南中介绍的其他自动化采集技术有相通之处——两者都依赖于对普通浏览器信号进行打分或记录,只是目的截然不同。
常见问题
会话回放和屏幕录制是一回事吗?
不完全是。会话回放并不捕获真实的视频或像素——它记录的是离散事件(鼠标位置、按键、DOM 变化),并在事后根据这些数据重建出视觉回放。结果看起来像屏幕录制,但你的设备上从未生成过真正的视频文件。
会话回放脚本能看到我的密码吗?
如果网站正确遮罩了密码字段,理论上不能——大多数供应商默认会排除 type="password" 的输入框。真正的风险在于其他敏感字段(社保号、卡号、输入到自由文本框中的医疗细节),独立审计发现这些字段被遗漏遮罩的情况比供应商预期的更常见。
我必须接受会话回放追踪吗?
没有统一的退出方式,因为它是逐个网站实现的,而非通过 Do Not Track 这样的浏览器级标准来统一控制。使用能过滤已知供应商域名的内容拦截器,是逐站阻止它最可靠的方式;一些司法辖区的隐私法律也要求同意横幅披露这类追踪,但执行力度差异很大。
会话回放和普通的网站分析有什么区别?
标准分析工具(页面浏览量、点击次数、汇总漏斗)以摘要形式记录"发生了什么"。会话回放则在单个鼠标和按键事件的级别上记录"事情是如何发生的",然后让人能够回放某一位访客的具体会话——这是一种粒度细得多、也更容易识别个人身份的数据采集方式。

