跳转至

你的浏览器透露了什么

下面列出的是网站在你打开页面的那一刻就拿得到的东西,没有问过你,也不需要你同意。任何一个网站都拿得到同样的东西。

什么时候用得上

换了新手机、刚重装完电脑、或是听人说某个浏览器比较安全却不知道差在哪里,下面三种情境都能自己核对答案。

  • 离开一段有监控的关系之后,换了新设备想确认自己现在看起来还像不像原本那个人。打开页面记下最上面那组短码,用旧设备再打开一次比对。短码不同,代表两台设备的指纹对不起来。
  • 参加完数字安全讲座,讲师提到 Tor Browser 比较安全,但没有说明差别在哪里。用平常的浏览器打开页面记下时区与字体,再用 Tor Browser 打开同一页。时区变成 UTC、字体只剩一组,差别自己看得到。
  • 要向别人说明为什么该在意,现场开着它比放幻灯片有效。画面上每一个数字,都是从对方自己的设备读出来的。

单看不起眼,加起来就认得出人

上面每一项单独看都很普通,时区有几十种、屏幕尺寸有几百种、字体组合有几千种。问题在于它们会相乘。几项凑在一起,能对上的人就从几百万掉到几十个,再加上你造访的时间与顺序,往往就剩一个。

这叫浏览器指纹。它不需要 cookie,你清除浏览数据也不会消失,因为那些值本来就在你的设备上。详细的原理见浏览器指纹是什么

换一个浏览器再看一次

最有用的用法是比较,有两个方式。

最上面的八位短码,是把上面几项稳定的值揉在一起算出来的。换一个浏览器打开同一页,比对短码有没有变就知道。窗口尺寸、存储配额等会漂移的值没有算进去,所以同一个浏览器每次开都是同一个码。短码本身就是一个识别码,这些值加起来就足以认出你。

想知道是哪一项变了,就看每一项下面那行对照值。时区那一项会直接写「Tor Browser 会显示:UTC」,不是「会被统一掉」这种描述,你当场就对得起来。

Tor Browser 打开,会看到时区真的变成 UTC、语言变成 en-US、显卡变成通用字符串、字体只剩一组固定的。Tor Browser 的做法是让所有使用者长得一样,网站就分不出谁是谁。

想调整这些行为,见 Tor Browser 进阶设置

什么时候该回来看一次

指纹会变,而且变的时候你通常不会知道。几个值得回来对一次短码的时间点:

  • 换了新设备或重装之后:确认新旧两台在网站眼中是不是同一个人
  • 离开一段受监控的关系之后:旧设备的短码对方可能记得,新设备要确认对不起来
  • 装了新的浏览器扩展之后:扩展会改变页面的行为,有些直接改变指纹
  • 改了系统语言、时区或屏幕分辨率之后:三项都算进短码里
  • 要向别人说明为什么该在意的时候:画面上每一个数字都是对方自己的设备产生的

短码只有八个字符,抄在纸上或记事本里就够,不需要留下整页的值。点一下短码会整段选取,剩下的复制动作由你自己按,这一页不碰剪贴板。

我们没有在收集这些

整个工具刻意做成一个指纹收集器,你当然要问:这些数值有没有被送出去?

答案是:所有数值只出现在画面上,没有送出去,也没有写进任何存储。代码在 anoni-net/docs,测试里有一项专门扫这份源代码,出现任何送数据或写入存储的手段就会让 CI 变红。

开发者工具会看到的那两个请求

打开开发者工具的网络分页,clearnet 版的页面会连两个地方。

anoni.net 底下的子域名是我们自架的 Umami,记录哪一页被看了、从哪里连过来、浏览器与操作系统的大类、屏幕尺寸的级距、国家,以及页面的加载速度。它不放 cookie,也不做跨站追踪。

屏幕尺寸的级距到 2026-08-23 才名实相符。在此之前页面上已经这样写,实际送出的仍是精确的宽高。现在送出前会无条件舍去到百位,1440x900 送出去是 1400x900。这一页说明屏幕分辨率是指纹的一环,我们自己却收精确值,前后并不一致。

加载速度也是同一天开始收的,内容是几个标准指标:首次内容绘制(First Contentful Paint)、最大内容绘制(Largest Contentful Paint)、累计布局偏移(Cumulative Layout Shift)。简体中文版的搜索索引有 3.2 MB,第一次按下搜索就要下载完整一份。在受限或高延迟的网络上,等待时间相当长,而要不要缩减它,目前没有任何数字可以参考。

每一笔记录还带着一个构建代号,例如 21eb17c,就是产生本页的 commit 短码。改版前后的数字因此区分得开,加载时间变长时才追得出是哪一次改动造成的。代号跟你无关,同一次构建的所有读者共用同一个。

static.cloudflareinsights.com 是 Cloudflare Web Analytics,一样是流量统计,但它是第三方,数据进到 Cloudflare 而不是我们的机器。网站本来就走 Cloudflare,所以那家公司无论如何都看得到你的请求,这支 beacon 多给它的是页面层级的性能与浏览数字。

两者都不会去读这一页列出的任何数值。

我们送出的设备与使用信息

自架的那个分析端点,每次完整加载页面时我们会多送一个值,就是上面表格里的「显示模式」:你是在浏览器标签页里看,还是把网站安装成 app 开着。送出去的只有那一个枚举值,没有其他字段。

为什么要这个数字:界面决策需要它。独立窗口没有地址栏,判断链接真假时少了一个线索,QR code 读取器与隐形字符检测那类工具的提示就得写得更完整。离线阅读要默认存多少内容,也跟有多少人真的把网站当 app 在用有关。没有这个数字,那些决定只能用猜的。

代价要说清楚:把网站安装成 app 的人是少数,所以这个值本身就是一个区分度不小的特征,跟表格里其他项目是同一种东西。我们把它列进表格而不是藏起来,理由就在这里。

小工具的使用情形

小工具区另外送七种事件。它们的用途都一样:知道哪里坏了、哪里该投资源。送出去的一律是固定的代号,没有文件名、网址,也没有你输入或解出来的任何内容。

事件 什么时候送
stripmeta-ok metadata 清除成功 格式代号
stripmeta-unsupported metadata 清除器遇到不支持的格式 heicpdfunknown 等格式代号
stripmeta-verify-fail 清完的文件打不开 格式代号
qrread-fail QR code 读不出来 cantOpennotFound,加上格式代号
qrread-kind QR code 读出来了 内容的粗分类,见下
offline-action 在离线阅读页按下操作 addremoveclearauto-onauto-offimages-onimages-off
display-mode 每次完整加载页面 上面说的显示模式

为什么要这些数字,用最近的例子说明。QR code 读取器有一段时间对 iPhone 拍的 HEIC 完全无效,画面显示「找不到 QR code」,而读者照着建议去裁图、重拍,做几次都不会成功,因为那张图从头到尾没有被解开过。那个状况持续了多久没有人知道,直到有人回报。qrread-fail 把「浏览器打不开这张图」与「图里真的没有码」分开数,同样的事下次会自己浮出来。

stripmeta-unsupported 回答的是「该不该投入支持 HEIC」。程序本来就分得出那个格式,只是不处理,过去那个信息直接被丢掉。

stripmeta-ok 是 2026-08-23 补的,用来当分母。在此之前只送失败,一个月 30 笔 unsupported,光看数字没有比较的基准。有了成功的计数才算得出失败率。

离线阅读的操作决定默认值。自动存下内容默认是开着的,预算约 29.5 MB。有多少人把它关掉、有多少人按了清除,直接告诉我们这两个默认对不对。

内容分类刻意做得粗

qrread-kind 送的是粗分类,不是实际的协议:

粗分类 涵盖
credential 两步验证密钥、Wi-Fi 密码
network onion 地址、Tor bridge
contact 联系人、电子邮件、短信、电话
location 坐标
link 一般网址
danger 会直接执行的协议
text 其余

合并是刻意的。送出细类的话,一笔 otp 等于「这个人刚扫了一组两步验证密钥」,一笔 wifi 等于「这个人正在连某个网络」。合并成 credential 之后,我们要回答的问题(哪一类的说明该加强)答案不变,但单笔事件不再指向一个具体处境。

danger 单独留着,那是「扫到会直接执行的协议」,发生频率本身就是安全信号。

整站共通的五种事件

2026-08-23 起另外送五种,用来决定文档本身该怎么写。

事件 什么时候送
search-used 有人用了站内搜索 字数级距 shortmediumlong
search-zero 该次搜索一笔结果都没有 同上
search-hit 点了搜索结果 firsttop3rest
lang-switch 用语言菜单换了语系 来源与目标的语系代号
read-depth 滚到文章的四分之一、一半、四分之三、底部 255075100

搜索关键词一个字都不送。你可能正在搜索「防火长城」或「翻墙」,搜索记录留在任何地方都是风险,包含我们自己的数据库。字数级距足以回答索引是否堪用,关键词内容答不出更多。零结果的比例指出缺少哪一类内容,点击位置反映排序是否恰当。

语系切换次数是唯一能知道翻译有没有人用的信号,因为文档站不看浏览器的语言设置,语系跟随你自己选过的偏好。正体中文读者改看英文版,通常代表译文或术语有问题,属于要回头修内容的线索。

阅读深度用来判断一篇文章该不该拆开。比窗口还短的页面不计数,短页面一加载就已经在底部,计数只会让平均值失真。

不想被算进去

clearnet 版可以直接关掉。下面的开关把 umami.disabled 写进这台设备的 localStorage,Umami 的脚本每次送出前都会检查该键,有值就一笔都不送。设置只留在本机,清掉浏览器数据就会回到默认。

看不到开关,多半是因为你正在看 onion 版,该版连分析脚本都不会加载,没有东西需要关掉。

另外三种方式。把网络关掉再开一次,断网时一个请求都不会有。用 Tor Browser 的 Safest 等级,JavaScript 全关,这一页与分析都不会执行。或者用 onion 版,那一版不加载任何分析。

浏览器开了 Do Not Track 或 Global Privacy Control 的话,从 2026-08-23 起我们也一笔都不送,下面「Do Not Track 与 GPC」一节有细节。

所有工具都不直接调用分析,一律经过同一个送出口,而那个送出口跟分析脚本写在同一个区块里,onion 与 IPFS 版构建时整段被移除。那两版的工具因此连送的能力都没有。

我们修正的一个搜索词泄漏

2026-08-23 之前,你从站内搜索结果点进任何一页,输入的文字会跟着送进我们的分析数据库。

原因是两个各自合理的默认值相加。文档站的搜索开了关键词高亮,Material 因此把命中的词写进每一条搜索结果链接的 ?h= 参数。Umami 默认把完整网址送出去,包含问号后面的查询参数。叠起来的结果是搜索词离开了你的浏览器。

现在每一笔送出前都会先过一道白名单。网址只留得下四个活动来源参数(utm_sourceutm_mediumutm_campaignutm_content),其余的问号参数与 # 后面的片段一律清掉,事件名称或值对不上白名单的整笔丢弃。白名单写在 main.html测试逐条验它,其中第一条验的就是上述泄漏。

2026-08-23 之前的旧记录仍留有搜索词,如何处理尚未决定。

onion 版没有这些

onion 版构建时会把整段分析拿掉,自架的分析与 Cloudflare 的 beacon 都不在里面,显示模式也不会送。

在 2026-08-23 之前,Cloudflare 那一支被摆在会被剥除的区块外面,onion 版照样会去加载它。那跟这一页原本写的「onion 版完全不加载分析」不符,是我们的疏漏,已经修正。

统计与识别的差别

同一个网站可以同时做「统计有多少人来看」与「认出你是谁」,前者需要的数据量远小于后者,分辨两者才是重点。

你实际上能做什么

上面十五项里,你在自己设备上真正关得掉的只有三项。剩下的一般浏览器没有提供开关,因为那些值本来就是网页平台的一部分。

设置路径会随系统与浏览器版本变动,找不到的话在设置里搜索关键字通常比照着点快。

效益最高的一步是换浏览器

单一动作能处理最多项目的,是改用有内建防护的浏览器。三种选择对应不同的处境:

你的情况 选择 代价
对手有能力对特定目标投入资源 Tor Browser 连接较慢,部分网站会挡
想在日常浏览里少留一点痕迹 Brave 对 canvas、WebGL、字体、audio 加噪声或统一化,日常代价小得多
不想换掉现在的 Firefox 开启 privacy.resistFingerprinting 要进 about:config 才找得到,开了之后部分网站会排版错乱

Tor Browser 把上面几乎每一项都统一掉,代价是连接较慢与部分网站会挡。Brave 对 canvas、WebGL、字体、audio 都加了噪声或统一化,日常浏览的代价小得多。Firefox 有 privacy.resistFingerprinting,效果接近 Tor Browser 的做法,要在地址栏输入 about:config 才找得到,默认是关的。那个设置页本身会先跳出警告,改到其他项目可能影响浏览器的其他功能,不熟悉 about:config 的话,直接用 Tor Browser 或 Brave 更单纯。开了之后部分网站会排版错乱。

先看看浏览器指纹是什么那篇的比较再决定。

关掉位置权限

这是唯一会跳出授权窗口的项目,也是唯一能在系统层级整个关掉的。

「设置」→「隐私与安全性」→「定位服务」→ 找到你的浏览器 →「永不」。

整个关掉定位服务也可以,但地图与相机的位置标记会一起失效。

「设置」→「应用」→ 你的浏览器 →「权限」→「位置」→「不允许」。

另外在浏览器里:「设置」→「网站设置」→「位置」→ 关闭。

「系统设置」→「隐私与安全性」→「定位服务」→ 取消勾选你的浏览器。

「设置」→「隐私和安全性」→「位置」→ 关闭「让应用访问你的位置」。

多数桌面环境没有系统层级的定位服务,浏览器自己的权限设置就是全部。在地址栏左侧的图标里可以撤销已经给出去的权限。

不管系统怎么设,浏览器每次都会问。按「不允许」就是了,而且那个选择会被记住。

改语言偏好

送出去的语言清单是你自己设的,改成单一语言可以少泄漏一点。

「设置」→「语言」→ 把不需要的语言移除,只留一种。

「设置」→「常规」→ 往下找「语言」→「选择」→ 只留一种。

Safari 用的是系统语言。macOS 在「系统设置」→「通用」→「语言与地区」,iOS 在「设置」→「通用」→「语言与地区」。

代价是多语言网站可能给你非偏好的版本。

Do Not Track 与 GPC 要想清楚再开

Do Not Track 是浏览器送出的「请勿追踪我」请求,Global Privacy Control 是它的后继版本。两个信号都可以在浏览器设置里开关,但开了不见得对你有利

实务上几乎没有网站遵守 Do Not Track,而送出信号的人相对少,所以它反而成为一个区分特征。Global Privacy Control 在美国几个州有法律效力,其他地方的效果与 DNT 相当。

本站从 2026-08-23 起遵守两者。开着任一个信号的话,我们的分析一笔都不送。其他网站多半不会跟进,在别处开着信号,得到的通常只是多一个区分特征。

要开的话:Chrome 在「设置」→「隐私与安全」,Firefox 在「设置」→「隐私与安全」,Safari 已经移除了这个选项。

时区与系统偏好改得到,但代价大

时区跟着操作系统走,改成 UTC 确实能少泄漏一项,但所有 App 的时间显示都会跟着错。深色模式、减少动态这些是无障碍设置,关掉会直接影响你每天的使用。

这两项的正确处理方式是换一个会统一它们的浏览器,而不是牺牲日常使用。

其余那些为什么关不掉

屏幕分辨率、CPU 核心数、显卡型号、canvas 与 audio 的渲染差异、装了哪些字体、Client Hints(浏览器主动回报的设备与系统信息)、元素的次像素位置,都没有开关可以关,因为它们是网页平台提供给网站的能力,使用者无法单独停用。画图需要显卡回报自己能做什么,排版需要量得出文字宽度。

挡掉那些能力的代价是网站会坏掉,所以浏览器不会让你单独关。有防护的浏览器改用另一种做法,让每个人回报的值都一样,或者加上每次都不同的噪声,能力本身不动。

两件我们刻意没做

没有导出按钮

导出的文件本身就是一份完整的指纹,留在设备上比不留更糟。要比较的话用眼睛看,或者自己抄下几个值。

没有独特性百分比

「你比 99.x% 的人独特」那种数字需要一个母体数据库才算得出来,我们没有,也不打算为了算它而开始收集访客数据。想看那种统计可以去 EFF 的 Cover Your Tracks,那是他们长期在做的研究。

地理位置

只有位置需要按按钮,因为它会跳出授权窗口。其他每一项都是不问就拿得到的。

按了之后你会看到经纬度与误差范围,通常精确到几十米以内。那些数字一样只留在画面上,刷新就没了。Tor Browser 直接停用定位功能,连问都不会问。

离线可用

跟这一区其他工具一样,程序存进设备之后没有网络也能用。上面列的每一项都是在你的设备上读出来的,断网时照样读得到。

要把这一页带着走,见离线阅读