我以为自己很谨慎,我把这种“私信投放”的链路追完了:你点一下,它能记住你的设备指纹
导读:我以为自己很谨慎,我把这种“私信投放”的链路追完了:你点一下,它能记住你的设备指纹 前言 我一直觉得自己点链接很小心:不随便点陌生短链、不轻易授权、不用社交账号直接登陆。但一次“私信投放”的好奇实验把我打回原形——点了一下,链路里居然悄悄把能识别我设备的痕迹都记下来了。下面把我追踪的过程、看到的技术细节和可落地的防护建议写清楚,方便你既能理解也能操作...
我以为自己很谨慎,我把这种“私信投放”的链路追完了:你点一下,它能记住你的设备指纹

前言 我一直觉得自己点链接很小心:不随便点陌生短链、不轻易授权、不用社交账号直接登陆。但一次“私信投放”的好奇实验把我打回原形——点了一下,链路里居然悄悄把能识别我设备的痕迹都记下来了。下面把我追踪的过程、看到的技术细节和可落地的防护建议写清楚,方便你既能理解也能操作验证。
我是怎么做的(方法与工具)
- 环境:台式机浏览器(Chrome),手机(Android 模拟器和真实机),以及一台运行代理抓包工具的笔记本。
- 工具:浏览器开发者工具的 Network/Storage 面板、Charles/Mitmproxy 抓包、手机用 Burp Suite 或者 Fiddler,另外用浏览器插件(uBlock Origin、Privacy Badger)做对照测试。
- 流程:在私信中点击投放链接 → 记录所有重定向(302/303)和请求 → 查看请求头、Query 参数、响应 Set-Cookie、localStorage/sessionStorage、Service Worker 注册、以及页面运行的第三方脚本和像素请求。
我看到的链路与关键环节(概览)
- 第一步是短链或重定向域(例如 t.cn / bit.ly 场景),它们把请求转到一个“投放平台”的中转域。
- 中转域往往带上一堆参数(utm 系列、gclid、fbclid、gbraid/wbraid、自定义 id/hash 等),并在中间插入一两个跳转,用来收集指纹数据和设置持久标识。
- 页面加载时立刻请求若干第三方脚本(analytics、ad SDK、tracking pixels),这些脚本会:
- 写入或读取 cookie、localStorage、IndexedDB。
- 执行 canvas/audio/webgl 指纹采集脚本,收集分辨率、字体、GPU、音频特征、时区、浏览器插件特征等。
- 如果是在应用内(社交 App 的内置浏览器),会尝试通过 URL scheme 或者 JS 桥与宿主 App 互通,传递设备或用户的 App-level id(比如 Android Advertising ID / IDFA)或利用 webview 特性获取更多信息。
- 服务端会把这些信息与已有数据库做匹配(有时是 deterministic,用哈希化的邮箱/手机/广告 id;有时是 probabilistic,用指纹特征做相似度匹配),最后返回一个可复用的标识符(有的以 cookie 形式回写,有的存在于 server-side 的 profile 中)。
一个实际的例子(简化)
- 点击短链 → 跳转到 track.example.com/collect?click_id=abc123
- 页面载入后向 tracker.examplecdn.com/pixel.gif?click_id=abc123&ts=… 发出请求,同时通过 XHR 把 navigator、screen、plugins 等信息以 JSON 发回服务器。
- 服务器返回 302,带着 set-cookie: tracker_id=xyz789; Max-Age=31536000;并重定向到最终落地页。
- 落地页的第三方脚本读取 tracker_id,并把它和广告平台的 ID 进一步关联,形成跨会话、跨域甚至跨设备的联结。
为什么这些数据能“记住你”的设备指纹(原理简明)
- 浏览器指纹并不依赖单一值,而是把大量属性组合在一起:User-Agent、屏幕大小、时区、已安装字体、canvas 渲染指纹、WebGL 信息、音频指纹、HTTP header、语言设置、以及更隐蔽的副特征(如硬件并发线程数、设备像素比等)。组合后唯一性很高。
- 一旦把这些属性和某个可复用的标识符(cookie、localStorage 值、app 广告 ID)绑定,后续即使换了短链或不同域,也能通过同样的脚本采集到这些属性并定位回原来的 profile。
- 在手机上,深度链接(deep link)、应用内浏览器桥接、以及社交平台的内置追踪能力,会把 web 与 app 的标识打通,进一步提高识别准确率。
我如何验证(你也可以试)
- 浏览器端:
- 打开 DevTools → Network,勾选 Preserve log。
- 点击可疑私信链接,记录所有重定向链条和第三方请求域名。
- 在 Application(或 Storage)面板查看 Cookies、localStorage、IndexedDB,有无新的持久条目。
- Console 中运行 navigator.userAgent / screen.width 等,或用公开的指纹测试站(AmIUnique、Panopticlick、FingerprintJS Demo)对比前后差异。
- 手机端:
- 在真机或模拟器上通过代理抓包(Burp/Charles),保持 HTTPS 代理证书信任。
- 点击私信链接,观察请求中是否出现广告 ID、设备型号、或特殊参数(gbraid/wbraid、fbclid)。
- 检查是否有尝试唤起本地应用的 deep link 或者返回带有 app-level token 的请求。
- 对照测试:在同一设备上先禁用第三方脚本或 uBlock,再做一次点击,看链路和持久储存是否减少。
可识别/可追踪的常用技术(速览)
- Storage:Cookies、localStorage、sessionStorage、IndexedDB、Cache API。
- Browser APIs:Canvas、WebGL、AudioContext、Battery API(曾被滥用)、MediaDevices、Touch/Pointer 事件时间差异。
- Network:Query 参数、Referer、User-Agent、Accept-Language、IP 地址(辅助定位)。
- App-level:广告 ID(GAID/IDFA)、App install/referrer、深度链接回传、SDK 上报。
- Cross-device linking:通过 hashed emails、手机号、登陆信息或 probabilistic matching(设备特征相似度)实现跨设备识别。
实际防护建议(落地、可执行)
- 点击前先看清真实 URL:长按链接或把鼠标悬停查看目标域名,警惕短链和多重重定向。
- 在独立的“实验”浏览器/容器里打开不信任的链接:为测试或临时访问使用专门的浏览器(比如一个没有登录账号、没有扩展的私有窗口),把常用账号隔离开。
- 阻止第三方脚本与像素:安装并启用 uBlock Origin、NoScript 或类似插件,屏蔽不信任域名的脚本和像素请求。
- 限制或清理存储:定期清除浏览器 cookie、localStorage,也可以设置浏览器在关闭时清理所有站点数据;使用容器/分域插件把跨站点追踪切断。
- 限制 JavaScript:对不信任的链路使用“禁 JS 的中立浏览器”(例如 Firefox 的 NoScript 或 Brave 的强限 JS),许多指纹采集需要 JS 才能完成。
- 使用屏蔽指纹的浏览器:例如 Tor Browser(为隐私优化,能显著降低指纹唯一性)或 Brave、Firefox+增强隐私设置。
- 移动端注意深度链接与 App 权限:不要随意在内置浏览器里授权或打开会唤起 App 的链接;在系统设置里限制应用的广告 ID 访问或重置广告 ID。
- 网络层保护:DNS-over-HTTPS/TLS、可信 VPN 可以隐藏真实公网 IP(IP 是重要的辅助因子)。
- 多用一次性或隔离身份:对于不信任的投放来源,使用临时邮箱或不登录状态浏览,避免 deterministic 链接(邮箱/手机号 hash)被关联。
- 对企业/营销人员:若需合规地做投放,明确告知用户数据用途并提供退出路径;越透明,用户信任越高。
对于普通用户该如何简单起步(3 步)
- 给自己一个“试验浏览器”:安装一个只用来点陌生链接的浏览器,里面不登陆社媒账号、不保存密码、不装扩展。
- 安装 uBlock Origin 并启用默认阻断规则,开启阻止第三方 cookie 的设置。
- 遇到可疑链接,先长按/悬停看真实地址,再决定是否打开;手机上避免在内置浏览器直接打开重要账号链接。
结语 点开一条“私信”可能只是一瞬间的好奇,但链路里发生的却是长期的数据积累与关联。理解这些技术细节能让你在日常使用里做出更有信息的选择。对我来说,这次追查的收获不仅是惊讶,更是把“谨慎”变成了可以复现、可以验证的操作手册——知道怎么看、怎么测、怎么防,才是真正的掌握。
如果你想,我可以把我抓包过程中一个真实(已脱敏)的重定向链写出来,或者教你一步步在自己的设备上复现并截图对比。想继续深入哪一块?
