真正的入口不在你以为的地方,我把这种“入口导航”的链路追完了:你点一下,它能记住你的设备指纹
导读:真正的入口不在你以为的地方,我把这种“入口导航”的链路追完了:你点一下,它能记住你的设备指纹 我最近追查了一种常见却容易被忽视的“入口导航”链路:用户点击一个看似普通的链接后,整条跳转链把你的设备信息悄悄抓走并和一个长期可识别的ID绑定起来。把链路抽干净告诉你:点击并不是一次性的动作——它常常会在后台建立可复用的“记忆”,让不同时间点的访问被拼凑成同一个人或...
真正的入口不在你以为的地方,我把这种“入口导航”的链路追完了:你点一下,它能记住你的设备指纹

我最近追查了一种常见却容易被忽视的“入口导航”链路:用户点击一个看似普通的链接后,整条跳转链把你的设备信息悄悄抓走并和一个长期可识别的ID绑定起来。把链路抽干净告诉你:点击并不是一次性的动作——它常常会在后台建立可复用的“记忆”,让不同时间点的访问被拼凑成同一个人或同一台设备的轨迹。下面把我跟踪过程、关键技术细节、如何自查以及可行的防护建议一并讲清楚。
我怎么追的(一句话概览)
- 在一台可控的设备上清空所有存储(cookie、localStorage、IndexedDB、缓存等),开启开发者工具的网络面板并保留日志。
- 点击目标链接,记录所有重定向、第三方请求、响应头、Set-Cookie、以及页面脚本加载顺序。
- 检查页面脚本是否执行指纹收集(canvas、WebGL、AudioContext、字体探测、客户端提示等),以及是否把收集到的指纹上传到某个域名或写入本地存储。
- 跟随跳转到最终落地页,观察是否带回某个ID参数,或者最终域名从第一次访问就能读取并复用此前写入的持久性存储。
- 为确认跨站复用,随后在另一台设备或同设备的无痕模式中重复访问对比。
入口导航链路长什么样(常见模式)
- 用户点击 → 第一跳(短链/第三方跳转域/广告追踪域)→ 追踪中转页(执行脚本采集指纹并回传)→ 最终落地页。
- 关键点:第一跳往往把点击者“登记”到某个追踪域,追踪域通过脚本和HTTP交互把指纹与一个ID绑定,并在重定向或后续请求中把这个ID带到最终域名或写入持久化存储中。
哪些技术被用来“记住”你
- HTTP层面
- Set-Cookie:追踪域直接写cookie(第一方或通过CNAME伪装成第一方)。
- URL参数:在跳转链中注入唯一标识符(例如?tid=abc123),后续站点读取并写入自己的存储。
- ETag/Cache:利用缓存标识作为半持久id(历史手法)。
- 浏览器存储
- localStorage / sessionStorage / IndexedDB:写入可跨会话的ID。
- Service Worker / Cache API:在浏览器内部创造更持久的存储和拦截能力。
- 指纹收集手段(前端)
- Canvas / WebGL 指纹:渲染差异产生可区分字符串。
- AudioContext 指纹:音频合成差异用于识别。
- 字体探测、屏幕分辨率、时区、语言、硬件并发等参数。
- Client Hints / 高级HTTP头:如Sec-CH-UA、Sec-CH-UA-Platform等提供细粒度信息。
- CNAME cloaking 与第三方脚本
- 通过将第三方追踪域伪装为客户自己的子域(CNAME),使追踪脚本以第一方身份执行,从而绕过第三方cookie限制。
- Evercookie 类技术
- 同时利用多种存储方式写入冗余标识,使删除单一存储后能被“复活”。
我追踪到的典型流程(把链路拆成可观察的步骤)
- 点击链接(比如社交平台或邮件里的短链)
- 浏览器请求短链域名,服务器返回302重定向到中转域(或直接返回含有JS的中转页面)
- 中转页面在重定向前或期间加载一段追踪脚本(来自追踪域或伪装的第一方子域)
- 脚本收集指纹特征并向追踪域发起AJAX/Beacon请求,服务器返回一个唯一ID(例如 tid=xyz)
- 追踪域通过Set-Cookie或通过在重定向URL中添加tid参数把这个ID带到最终落地域
- 最终落地页读取tid并存入自己的localStorage或cookie,使后续访问可以关联到这个ID
- 当你再次访问该站点或站点的其他合作页面时,只要脚本能读取该ID或重新生成相同指纹,就能把行为关联回原来的档案
如何自己验证(操作步骤,面向普通用户与技术用户) 面向普通用户(无工具)
- 使用无痕/隐私模式打开目标链接和常规模式对比。
- 观察是否在普通模式下同一账号/设备的访问会被“记住”——比如广告内容、推荐是否一致。 面向技术用户(推荐)
- 在开发者工具中打开Network,勾选Preserve log,然后清空浏览器存储(Application -> Clear Storage)。
- 点击链接,观察:
- 所有302/301重定向链(Location响应头)。
- 任意带有Set-Cookie的响应。
- XHR/Fetch/Beacon请求中是否上传大量参数(canvas数据、fonts、screen等)。
- 检查Application面板的localStorage、IndexedDB、Cookies是否新写入数据。
- 可用代理抓包(Charles、Fiddler、mitmproxy)观察请求体与响应体。
- 在不同机器/不同网络环境下重复访问,验证ID是否跨场景复用。
能被记录的“指纹”有多独特?
- 单靠少量信息(分辨率、UA)往往不能唯一识别,但组合几十个细节(canvas、webgl、插件、字体、时区、语言、硬件并发、client hints)后,指纹的唯一性显著上升。
- 实际上很多服务并不需要真正唯一的指纹,他们只需高概率将未来行为与过去某次点击匹配,就能完成广告归因或用户拼接。
这对普通用户意味着什么
- “我只点了一次链接”并不能保证行为不会被长期追踪。一次点击就可能建立起跨站、跨会话的识别能力。
- 隐私模式、VPN、清理cookie可以增加阻碍,但并非对抗所有指纹技术的万无一失手段。尤其是在网站利用多种存储方式和CNAME绕过时,单一手段很难完全阻断。
- 广告、推荐、定向内容更精准,但同时用户可被长期画像,可能影响信息暴露或被用于价格歧视、信贷风控等场景(取决于数据被谁如何使用)。
对网站开发者与运营方的建议(如何减少对用户隐私的侵害并降低法律风险)
- 审查并最小化第三方脚本:把第三方服务列清单,定期审计它们收集的信息类型与持久化策略。
- 避免CNAME伪装与把第三方变为“第一方”的做法:这会让监管与审计更困难,也让用户更难分辨谁在处理数据。
- 在用户同意框架之外,不要把点击直接转化为长期可识别ID。短期会话标识应尽量短寿命、加上合理的删除策略。
- 如果必须进行行为归因或分析,尽量采用聚合化、差分隐私或仅在经用户明确同意情况下进行持久化识别。
- 提供明确的隐私声明和删除通道:让用户能查到哪些ID关联了他们、如何删除这些信息。
普通用户的可操作防护(实际可行、易上手)
- 使用浏览器扩展屏蔽追踪脚本(uBlock Origin、Privacy Badger、NoScript等)。
- 阻止第三方Cookie,并限制或清理站点的localStorage/IndexedDB。
- 使用具有反指纹或指纹隔离功能的浏览器(Brave、Tor Browser、Firefox +防指纹扩展)。
- 对关键场景使用单独的浏览器/容器来隔离身份(比如工作账户、个人账户、敏感浏览)。
- 对不信任的短链或广告链接保持谨慎,优先在隐私窗口或工具中打开以观察差异。
- 对企业用户:部署企业级浏览器策略,禁用不必要的客户端提示和插件。
结论(一句话总结) 一次看似普通的点击,很容易被构造成“入口导航”链条中的关键握手,从而把你设备的各项特征拼接成长期可识别的档案。了解链路、学会检测和采取合理的防护,可以显著降低被长期追踪的风险;对网站方而言,减少不必要的跨域持久识别,不仅是对用户隐私的尊重,也能减少合规与信任上的成本。
如果你愿意,我可以:
- 给你一份更具体的自查清单(按浏览器分步操作)。
- 帮你把某条可疑链接的网络抓包结果看一眼,告诉你哪里写了什么(只限你自己的设备或你有权检测的流量)。 要不要我把自查清单整理成可复制的步骤发给你?
