浏览器扩展往往能读取你访问的所有网页数据,甚至在页面中注入脚本。了解扩展的权限风险、如何评估其安全性,以及减少隐私泄露、保护浏览数据的实用方法。
是的,如果你授予了足够宽泛的权限,浏览器扩展几乎可以读取并修改你在网上的一切操作。一个拥有“访问你在所有网站上的全部数据”权限的扩展,可以看到你访问的页面、你在表单中输入的文字、你的 Cookie,以及你的浏览历史。绝大多数扩展是诚实的,但真正关键的是权限模型:最安全的做法是只安装少量扩展、授予尽可能窄的访问权限,并定期进行审查。
扩展究竟能做什么
当你安装一个扩展时,你授予了它在清单(manifest)中声明的一组权限。这些权限决定了扩展能看到和修改你浏览行为的程度。很多人会在没看清提示的情况下直接点击“添加到浏览器”,所以有必要先弄清这些权限类别到底意味着什么。
一个拥有宽泛主机权限的扩展,通常可以:
- 读取页面内容——你打开的每个页面的完整文字、链接和结构
- 读取并填写表单字段——包括搜索框、登录表单和支付字段
- 访问 Cookie——其中可能包含让你保持登录状态的会话令牌
- 读取你的浏览历史——你访问过的站点和网址列表
- 注入脚本——在其他网站内部运行它自己的 JavaScript
- 发起网络请求——把它收集到的数据发送到远程服务器
关键在于:扩展是带着你的活动会话,运行在你的浏览器内部的。它不是一个受同源策略约束的远程网站,而是一个被信任的“内部人员”。这正是为什么一个微小的权限失误,可能带来巨大的隐私影响。这种清单层面的权限授予,与网站自身可以查询的页面级 navigator.permissions.query() API 是完全不同、宽泛得多的概念——参见 Permissions API 指纹了解那个独立、更窄的机制如何运作。
用通俗语言理解权限模型
现代浏览器(Chrome 的 Manifest V3、Firefox 的 WebExtensions)通过一个清单文件来描述扩展的影响范围。下面是一个简化的示例,展示你在安装时其实是在批准的权限部分:
{
"name": "示例扩展",
"permissions": ["cookies", "tabs", "storage"],
"host_permissions": ["<all_urls>"],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
其中 <all_urls> 这个值最值得警惕。它意味着扩展可以在你访问的每一个网站上运行它的内容脚本、读取这些页面并对其进行操作。相比之下,限定在单一域名上的扩展只能触及那一个网站。
主机权限与 <all_urls>
主机权限定义了扩展可以在哪些站点上运行。像 https://*.example.com/* 这样的模式将其限制在一个服务内;而 <all_urls> 或 *://*/* 则授予了对整个网络的访问权限。宽泛的主机权限,是决定一个扩展隐私影响范围的最大单一因素。
activeTab 与点击时访问
activeTab 权限要安全得多:它仅在你点击扩展图标时授予对当前标签页的临时访问权限,而当你离开该页面后,权限即被收回。基于 activeTab 构建的扩展无法在后台悄悄地监视你。如果浏览器提供这一选项,把站点访问设为“点击时运行”,就能把宽泛的扩展变成按需运行的扩展。
内容脚本
内容脚本是扩展注入到你所访问页面中的代码。它可以读取 DOM、观察你输入的内容,并改写页面。内容脚本既是正当功能(价格比较、语法检查)的实现机制,也是滥用式数据收集的手段。它的 matches 模式的覆盖范围,决定了它能看到你多大比例的浏览行为。
好扩展也会“变坏”
风险并不仅来自一开始就心怀恶意的扩展。还有几条不那么明显的路径,会通向同样的结果。
- **被弃用的扩展。**开发者停止维护某个扩展,代码仍然能用,但安全漏洞无人修补,这个扩展就变成了一个带着宽泛权限、陈旧失修的入口。
- **被收购后用于牟利的扩展。**一个广受信任的热门扩展被卖给新所有者,对方悄悄推送一次更新,注入广告、联盟链接或追踪代码。你的浏览器会自动更新它,而你多年前授予的权限依然有效。
- **供应链被攻击。**某个扩展正当地打包了第三方库或依赖远程配置;一旦该依赖或服务器被攻陷,恶意载荷就会送达所有安装了该扩展的用户。
真正危险的时刻,往往不是安装那天,而是几个月后那次悄无声息的自动更新——它依托的,正是你早已批准并遗忘的权限。
这就是为什么“我安装时它还是好好的”并不能作为保证。宽泛的权限是一种长期存在的隐患,可能在未来任何一次更新中被激活。
扩展与指纹识别
除了直接读取你的数据之外,扩展还会让你更容易被跨站追踪——此外,它也可能让你更容易被标记为自动化程序。你所安装的那一组特定扩展,以及它们对页面所做的改动,都可能成为你浏览器指纹的一部分。
页面如何探测你安装了哪些扩展
页面无法直接向浏览器索要一份“你装了哪些扩展”的清单。看上去最接近的 API 是 navigator.plugins,但在现代浏览器里,这份列表只描述浏览器自身内置的 PDF 处理能力,永远不会包含你安装的扩展。探测扩展靠的是另一条路:搜寻扩展在页面上留下的副作用。
- **资源探测。**许多扩展会打包一些文件——图标、注入的样式表、内容脚本包——并将其暴露给网页,以便自己的脚本能够加载它们。扩展会把这些文件声明为网页可访问资源,位于类似
chrome-extension://<extension-id>/<file>这样的网址上。一段追踪脚本只要知道某个热门扩展的 ID 和文件名,就可以请求这个网址并检查它是否能加载成功:加载成功说明该扩展已安装,失败则说明未安装。对一批已知的扩展 ID 逐一这样检测,就能拼出你已安装扩展集合的“是/否”指纹。正是这种探测手法,促使 Manifest V3 收紧了web_accessible_resources:一项资源如今只对matches模式中列出的来源开放,扩展还可以选择启用use_dynamic_url,用一个由 Chrome 在每次会话(浏览器重启或扩展重新加载)时重新生成的 ID,替换掉它固定不变的那个。Firefox 则默认就这么做:它给每个浏览器实例分配一个随机的moz-extension://UUID,而不是扩展的真实 ID,目的正是不让网站借此识别出你装了哪些扩展。不过这两道防线都不追溯既往:没有启用动态网址的扩展,依然会在它公开且固定的 ID 上作出响应——这也是这套探测手法至今仍然奏效的原因。 - **行为侧信道。**即便一个扩展没有任何可以直接探测的资源,它仍然会作用于页面。一段会注入元素、添加 CSS 类或移除符合过滤规则的节点的内容脚本,会留下页面可以观察到的结构性痕迹——广告拦截器删除的元素、密码管理器注入的按钮、语法检查工具标记出的文本框。时机本身也是一种信号:在
document_start阶段运行的脚本会先于页面自身代码执行,在document_idle阶段运行的脚本则在其后执行,扩展生命周期中的这两个时间点都能从页面一侧测量出来。广告拦截器是最典型的例子:网页无法直接询问用户是否安装了广告拦截器,只能设置一个诱饵元素或监视某个请求是否被拦截,再据此推断结果——参见广告拦截器检测的真实原理,了解背后的三种检测方式,以及检测结果能揭示什么、又揭示不了什么。
稀有的扩展组合会让你更容易被识别
这正好呼应上文提到的指纹悖论:一个小众的隐私扩展,可能让你的浏览器变得更容易识别,而非更难,因为很少有其他用户拥有完全相同的配置。被探测到的扩展和其他任何指纹信号一样——参见我们关于指纹熵与匿名集的文章,了解真正缩小你所融入的人群规模的是稀有程度本身,而不是使用某个工具这件事。EFF 的 Cover Your Tracks 衡量的正是你整个浏览器的这种唯一性权衡,而三四个被检测出来、组合起来又不常见的扩展,其影响方式和一个罕见的字体或 GPU 字符串是一样的。
扩展会让你被误判为机器人吗?
扩展检测还服务于另一套评分体系:机器人检测。自动化框架有时会在一个原本普通的浏览器配置之上,附带运行一些图方便的扩展——代理管理工具、验证码自动求解扩展、忘了关掉的开发者工具。检测到其中任何一个,尤其是再叠加 navigator.webdriver 被设为 true,都会计入与无头浏览器和脚本化流量相同的风险评分;参见机器人检测技术了解这类信号是如何组合成一个判定结果的。这也可能反过来影响真实用户——一个日常真实使用的开发者或无障碍辅助扩展,偶尔也会把一次原本正常的浏览会话推过网站的自动化判定阈值,这也是即便不考虑隐私追踪、扩展卫生同样重要的另一个原因。按扩展类别逐一拆解哪些扩展破坏了哪些信号,参见浏览器扩展会让你被判定为机器人吗。
想了解你整体的指纹状况,可阅读我们的浏览器指纹完全指南;想对比不同的加固方案,可参阅我们的隐私工具对比。
安装前如何评估一个扩展
对待每个扩展,都应像授予某个应用访问你账户的权限一样谨慎,因为从功能上看,你做的事情与此非常接近。请逐项核对下面这份清单。
| 信号 | 风险较低 | 风险较高 |
|---|---|---|
| 权限范围 | activeTab、单一主机模式 | <all_urls>、宽泛主机权限 |
| 发布者 | 知名公司或老牌开发者 | 匿名或全新账户 |
| 用户量与评价 | 安装量大、评价稳定 | 用户极少,或评价突然激增 |
| 最后更新时间 | 近期且定期更新 | 多年未动(已弃用) |
| 源代码 | 开源、可审计 | 闭源、混淆、仅有压缩代码 |
| 数据处理方式 | 清晰、最小化的隐私说明 | 隐私政策含糊或干脆没有 |
没有任何单一信号能下定论,但它们的组合会讲出一个故事。一个限定为 activeTab、由活跃开发者维护的开源扩展,与一个闭源、<all_urls>、三年前最后一次更新的扩展,是截然不同的两回事。
你也可以检查自己浏览器中当前正在运行的扩展。BrowserInsight 的插件与扩展检测工具能帮你查看可被检测到的扩展,并理解它们的影响范围;而指纹检测工具则会展示你的整体配置如何影响可追踪性。
降低风险的实用步骤
你不必彻底放弃扩展——你需要的是有意识地去管理它们。
1. 遵循最小权限原则
优先选择请求权限最窄的扩展。如果两个扩展能完成同样的工作,就选限定为 activeTab 或特定主机的那个,而不是要求访问所有网站的那个。
2. 使用“点击时”访问
对于支持该选项的扩展,把站点访问设为“点击时运行”,让它们只在你主动调用时才运行。这能在不损失功能的前提下,消除大部分后台数据收集。
3. 定期审查
每年一到两次,打开浏览器的扩展管理页面,删除所有你已不再使用的扩展。每个已安装的扩展都是攻击面;一个用不上的扩展,就是纯粹的负担。
4. 留意更新与所有权变更
如果一个原本简单的扩展突然开始请求新的、更宽泛的权限,要保持警惕——浏览器通常会提示你。权限的突然扩张,可能意味着所有权或意图发生了变化。
5. 在适当场景下使用企业策略
在受管理的环境中,管理员可以通过浏览器策略将经过批准的扩展加入白名单,并屏蔽其余所有扩展。这是大规模场景下最可靠的控制手段,彻底免去了逐个用户自行判断的环节。
6. 如果浏览器自带同等功能,优先用原生功能而非扩展
Firefox 的 Multi-Account Containers 曾经是在同一个浏览器里把不同身份彼此隔开的唯一办法——现在它正在变成一项无需装扩展的原生功能。如果浏览器已经原生提供了同等能力,用它就意味着少信任一个拥有宽泛主机权限的扩展。这种隔离到底覆盖了什么、又覆盖不了什么,可参见容器标签页与追踪——它是一条存储边界,并不能替代你对仍在运行的扩展逐一审查。
常见问题
浏览器扩展能读取我的密码吗?
如果一个扩展有权在你登录的网站上运行,并有权读取表单字段,那么它在技术上就能在密码被提交之前,观察到你输入的内容,包括密码。这正是为什么向不受信任的扩展授予宽泛主机权限非常危险。对于运行在页面上的内容脚本而言,密码字段并不会自动成为禁区。
来自官方商店的扩展一定安全吗?
不一定。官方商店会进行自动化审核和部分人工审核,能过滤掉大量纯粹的恶意软件,但审核并不完美。被弃用的扩展、所有权转移,以及引入追踪的更新,都可能蒙混过关。出现在商店里能降低风险,但无法消除风险。
隐私扩展会让我更难被追踪吗?
有时是,有时恰恰相反。内容拦截器可以阻止许多追踪器,但你所运行的那一组与众不同的扩展,以及它们对页面所做的改动,反而可能增加你的指纹特征。请尽量选择被广泛使用、维护良好的工具,而非小众冷僻的工具,并通过指纹检测来验证最终的净效果。
装多少扩展算太多?
并没有一个固定的数字,但每个扩展都会增加权限、攻击面和潜在的指纹信号。一个不错的原则是:只保留你正在积极使用的扩展,优先选择窄权限,其余一律删除。少而精的扩展,胜过一长串被遗忘的扩展。


