← 返回目录

Firefox 隐私加固( Harden Firefox, Firefox Hardening )系列第七篇:我的 Firefox 配置模板,到底改了什么?

发布于 2026-08-08
最初发布:2026-08-08 11:30:00 (UTC) · 最后修改:2026-08-28 06:41:34 (UTC) · 全文12540字 · 预计阅读42分钟
#Arkenfox#Betterfox#Firefox#Firefox Hardening#Firefox隐私加固

  和 ChatGPT 讨论后,我写了这篇文章,GPT 认为有必要。


  上一篇文章,我们介绍了 Firefox 的各种配置方式,以及 Arkenfox 、 Betterfox 和 user-overrides.js 之间的关系。这一次不再介绍“配置文件是什么”,也不再一项一项教你怎样打开  about:config。这一篇直接把我自己正在使用的 user-overrides.js 拿出来,解释一个更实际的问题:我到底改了什么?为什么这么改?为什么有些地方反而没有追求“越严格越好”?


  这里必须先强调一下:下面这些设置【不是】“Firefox 隐私加固标准答案”,而是我自己的配置取舍。我的总体目标非常明确:尽量加强隐私、安全和抗追踪能力,同时尽量保留一个普通桌面浏览器应该有的完整功能。所以你会看到一些非常“矛盾”的东西。比如我会关闭 WebRTC 、地理位置和一些硬件 API ;另一方面,我又故意保留 JavaScript 、 WebGL 、 Firefox Sync 、历史记录、会话恢复、搜索建议,甚至允许 Firefox 的赞助内容。

  

  这并不是我前后矛盾。恰恰相反,这是我对“隐私”和“可用性”进行权衡后的结果。


 (一)先说清楚:这当然【不是】一份“越狠越好”的配置,我本系列第二篇博文说了我 Reddit 被封禁。


  Arkenfox 官方也明确提醒,user.js 的修改会带来网站兼容性问题,因此用户需要根据自己的需求进行覆盖文件覆盖 overrides,而不是机械地把所有设置全部照抄。Arkenfox 目前仍然把 user-overrides.js 作为正常使用方式之一。 Betterfox 同样明确把自己的定位放在“隐私、安全、性能和网站兼容性之间的平衡”上。所以,我自己的文件实际上可以理解成:Betterfox / Arkenfox + 我的个人需求 + 我的实际测试结果。而【不是】:Betterfox / Arkenfox + 再把所有能找到的“隐私开关”全部打开。全部打开,也会导致我使用不舒服,例如不保留历史记录,我覆盖文件备注里写了。这也是为什么我的配置里会有大量注释。我希望以后自己重新看这份文件的时候,知道:“这条为什么存在?”;而不是只知道:“这条有人让我打开。”




(二)连接与安全:优先保护真正重要的攻击面


 1.HTTPS-First / HTTPS-Only

user_pref("dom.security.https_first", true);

user_pref("dom.security.https_only_mode", true);

这两项属于非常典型的安全强化。


  HTTPS-Only Mode 的核心作用,是尽量把网站连接升级到 HTTPS,避免明文 HTTP 连接。Firefox 官方也明确说明,HTTPS-Only Mode 会尝试把普通 HTTP 地址升级为 HTTPS。对于现代互联网来说,这类设置的收益非常直接:能走 HTTPS,就不要主动接受 HTTP。因为可以被完整明文嗅探( Sniff ),即你看到的所有内容别人看到一清二楚。当然,代价也很明显。如果某个老旧网站真的只有 HTTP,或者 HTTPS 配置有问题,那么开启 HTTPS-Only 后就可能无法访问。所以这属于:安全收益比较明确,但存在兼容性【代价】。我认为这是值得付出的代价。


 2.DoH:为什么我选择 network.trr.mode = 2

user_pref("network.trr.mode", 2);

  这里是一个很有代表性的例子。network.trr.mode = 2 可以理解为:优先使用 DNS over HTTPS(DoH),防止嗅探你的 DNS 查询;如果 DoH 失败,再回退到系统 DNS。 Mozilla 当前源码仍然把 `2` 定义为 TRR first,`3` 则是 TRR only。即只能用 DoH 。为什么我没有直接使用 `3`?因为 `3` 的含义是:只使用 DoH,不使用系统 DNS 回退。这样隐私模型更强,但网络环境的要求也更苛刻。比如校园网、公司内网、机场 Wi-Fi、本地域名解析等场景,都可能依赖本地 DNS。

  所以我的选择是:优先 DoH,但不要为了追求理论上的“绝对”而轻易牺牲网络兼容性。这也是这份模板最核心的思想之一。


3.ECH:让 TLS 握手中的部分信息进一步隐藏

user_pref("network.dns.echconfig.enabled", true);

  ECH,也就是 Encrypted Client Hello(加密客户端问候),用于减少传统 TLS 握手中部分信息暴露。Firefox 当前源码中仍然存在这个首选项,而且 Firefox 已经把 ECH 作为正常的现代网络能力维护。这里需要注意:开启 ECH 【不等于】“所有网站都自动完全匿名”。它只是减少特定握手阶段的信息暴露,实际能否使用还取决于网站、DNS 和网络环境。所以我把它理解成:低成本增加一层网络隐私。当然现在大部分网站不支持 ECH ;所以大部分情况下其实无用。


(三)证书:我为什么关闭企业根证书自动导入

user_pref("security.enterprise_roots.enabled", false);

这项比较重要。Firefox 可以在特定平台上使用操作系统中的企业根证书。对于企业环境来说,这非常方便。例如公司需要通过自己的 CA(Certificate Authority,证书颁发机构)检查 HTTPS 流量,审查员工正在干什么;那么浏览器必须信任这些证书。但对于普通个人电脑来说,这意味着:浏览器信任链的一部分来自操作系统,而不完全由 Firefox 自己管理。因此我选择关闭自动信任企业根证书。不过这不是“开了就一定更安全”。如果你所在单位确实依赖企业证书,那么关闭它可能直接导致内网 HTTPS 网站报证书错误。所以这条应该理解成:个人设备上的信任边界收紧,而不是普遍适用的“必须关闭”。

  Firefox 官方的企业策略文档也明确指出,这个设置对应的是 `security.enterprise_roots.enabled`。


 (四)安全浏览:为什么我没有为了隐私而彻底关闭 Safe Browsing

我的配置中保留了:

user_pref("browser.safebrowsing.downloads.remote.enabled", true);

user_pref("browser.safebrowsing.malware.enabled", true);

user_pref("browser.safebrowsing.phishing.enabled", true);


  这一部分其实非常能够体现我的取舍。有人看到“向第三方查询”几个字,就会本能地把它全部关掉。但安全和隐私并不是永远同一个方向。例如恶意软件下载检测,本身就是安全能力。如果完全关闭,那么你的确减少了某些外部数据查询,但同时也失去了一层安全防护。所以我的原则不是:“任何数据流向第三方的功能全部关闭。”而是:先判断这个功能究竟提供了什么安全收益,再决定这个数据流是否值得接受。对于普通用户来说,我认为保留安全浏览功能的意义通常大于那一点点额外隐私收益。当然,如果你的威胁模型是极端隐私,那么情况就完全不同。因此我的模板在最后专门保留了一个“极端隐私模式”章节,把这种设置单独放在那里。


(五)更新:我为什么关闭自动安装,却保留更新检查

user_pref("app.update.auto", false);

user_pref("app.update.enabled", true);

user_pref("extensions.update.autoUpdateDefault", false);

user_pref("extensions.update.enabled", true);

  

  这个也不是为了隐私。纯粹是个人使用习惯。我希望:Firefox 可以检查有没有新版本,但是否立即安装由我决定。扩展也是一样。

  

  为什么?因为隐私加固配置本身就可能和 Firefox 新版本发生兼容性变化。如果浏览器自动更新、扩展又自动更新,然后我的配置突然出现异常,我会很难判断:到底是 Firefox 变了,还是扩展变了,还是我的配置出了问题?所以我选择:允许检查更新,但把真正的升级动作留给自己。


  当然,这会带来一个明显代价:你必须自己负责更新。如果长期忘记更新,安全风险反而可能更高。因此这一组不是“隐私设置”,而是“维护策略”。本系列第四篇博文也阐述了如何更新。扩展也是相同策略。



(六)遥测与 Firefox Sync:为什么我没有“一刀切”

  这一部分可能是整份模板里最容易被误解的。我主动保留了一部分数据提交功能:


user_pref("datareporting.healthreport.uploadEnabled", true);

user_pref("datareporting.policy.dataSubmissionEnabled", true);

user_pref("toolkit.telemetry.unified", true);

user_pref("toolkit.crashreporter.enabled", true);



  同时,我还保留:


user_pref("identity.fxaccounts.enabled", true);

user_pref("services.sync.engine.bookmarks", true);

user_pref("services.sync.engine.history", true);

user_pref("services.sync.engine.passwords", true);

user_pref("services.sync.engine.prefs", true);

user_pref("services.sync.engine.tabs", true);

user_pref("services.sync.engine.addons", true);



  理由很简单:我不是以“绝对零数据上传”为目标。我的目标是:减少不必要的第三方追踪,同时保留我真正需要的 Firefox 服务。Firefox 官方文档目前仍明确说明,Telemetry 和相关数据提交属于浏览器的数据收集体系,而 `DisableTelemetry` 政策会影响多个相关首选项。因此这里必须区分:“我不想被广告平台追踪”和 “我不允许 Mozilla 收到任何数据”。这是两个完全不同的目标。我的配置属于前者。


  当然,这里我也要专门纠正自己以前注释里的一种过强说法:不能简单写成“开启 `datareporting.healthreport.uploadEnabled` 就是为了让 Firefox 获得广告内容,或者这是获得赞助内容的绝对必要条件”。我没有找到足够的 Mozilla 官方资料证明这两个机制可以这样直接画等号。比较严谨的说法应该是:我选择保留 Firefox 的部分数据提交与推荐内容相关能力,因为这符合我“在保留 Mozilla 服务的同时尽量减少第三方追踪”的整体取舍。


 这样更准确。



 (七)历史记录和会话恢复:隐私浏览器并不等于“什么都不保存”


我的配置中主动恢复了:


user_pref("places.history.enabled", true);

user_pref("privacy.clearOnShutdown.enabled", false);

user_pref("privacy.sanitize.sanitizeOnShutdown", false);



以及:


user_pref("browser.startup.page", 3);

user_pref("browser.sessionstore.enabled", true);

user_pref("browser.sessionstore.resume_from_crash", true);


这意味着:我希望 Firefox 像一个正常的主力浏览器一样工作。我【不】希望:今天登录的网站,明天全部登录失效;昨天打开的标签,浏览器一关闭就全部消失;电脑崩溃后,也找不回来原来的窗口。这就是为什么我没有机械地照搬一些“隐私最大化”方案。隐私模型越强,通常越需要牺牲浏览器的持久化能力。而我的主实例不是洋葱路由 Tor Browser。它是我的日常 Firefox。因此:主实例【优先考虑】长期可用性。



 (八)广告、推荐和 Pocket:为什么我故意保留


这一部分看起来可能最“反隐私”。例如:


user_pref("browser.urlbar.quicksuggest.enabled", true);

user_pref("browser.urlbar.quicksuggest.sponsored", true);

user_pref("browser.urlbar.quicksuggest.nonsponsored", true);


user_pref("browser.newtabpage.activity-stream.enabled", true);

user_pref("browser.newtabpage.activity-stream.feeds.telemetry", true);

user_pref("browser.newtabpage.activity-stream.feeds.discoverystream", true);


user_pref("browser.newtabpage.activity-stream.showSponsored", true);

user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", true);

user_pref("browser.newtabpage.activity-stream.discoverystream.show_spocs", true);


user_pref("extensions.pocket.enabled", true);


  为什么?因为我的目标并不是:“让 Firefox 彻底失去商业化能力。”,前面已经允许 Mozilla 的广告了。而是:“不要因为隐私加固,把 Firefox 自己的正常功能全部砍掉,和要支持 Mozilla 。”所以我愿意接受:搜索建议;推荐内容;赞助内容;Pocket;部分 Mozilla 数据提交。

  换句话说:我反对无意义的追踪,但不反对 Firefox 本身有正常的服务和商业模式。这也是为什么这份配置不能简单被称为“最极端隐私配置”。它其实是一份:隐私优先,但仍然允许产品正常运行的配置。


(九)RFP:为什么我坚持保留抗指纹追踪


我的配置中:

user_pref("privacy.resistFingerprinting", true);

user_pref("privacy.resistFingerprinting.letterboxing", true);

user_pref("privacy.resistFingerprinting.block_mozAddonManager", true);


  这里的核心就是:Resist Fingerprinting(RFP,抗指纹追踪)。指纹识别的思路并不是读取你的“姓名”。网站可以综合:屏幕尺寸、语言、字体、时区、 Canvas 、 WebGL 、浏览器行为、各种 Web API、硬件相关信息等,然后形成一个相对稳定的浏览器特征组合。


  RFP 的核心思路之一,就是:不要让浏览器表现得过于“独特”,而是让大家看上去都一样。因此我宁愿 Firefox 表现得有些“不自然”,也不希望它把太多真实硬件与环境细节直接暴露给网页。但同时也不能过于特殊,前文说了我 Reddit 被封禁了。可能就是过于特殊了。


 (十)字体:这一项为什么非常值得关注


user_pref("layout.css.font-visibility", 1);


这是我非常看重的一项。Firefox 当前源码明确给出了这个首选项的三个可见性等级:


* `1`:只允许网页匹配基础系统字体;

* `2`:额外允许语言包字体;

* `3`:额外允许用户安装字体。


  所以我选择:1。原因不是为了让网页“更安全”这么简单。而是因为:字体本身就是浏览器环境信息的一部分。如果网页可以知道:你安装了哪些字体、你的系统中有哪些区域特有字体、甚至有哪些特殊软件留下的字体资产等,尤其是特殊字体,那么它就可能从这些信息中得到你的设备环境特征。因此,我宁可牺牲一点字体精确匹配,也不希望把宿主机的字体资产全部公开给网页。Firefox 【当前】源码对这个首选项的定义仍然是上述三个等级。


(十一)WebRTC、地理位置和硬件 API:这里是真正的“砍功能”


我的配置主动关闭:


user_pref("media.peerconnection.enabled", false);

user_pref("geo.enabled", false);

user_pref("dom.battery.enabled", false);

user_pref("dom.gamepad.enabled", false);

user_pref("dom.vr.enabled", false);

user_pref("device.sensors.enabled", false);


  这些设置的逻辑比较直接。网站本来可以通过 Web API 获取:地理位置、设备电量、游戏手柄、传感器、 VR 、 WebRTC 网络信息等,当然也可以识别你。


  我的判断是:普通网页很少真正需要知道这些信息,且我未遇到什么异常。而且网页可以通过 WebRTC 这类客户端之间直接通讯,来节约自己网站的流量开支,让你家流量用量异常,因此,对于主力浏览器来说,我更愿意主动减少这些 API 暴露面。其中 WebRTC 尤其值得注意。

  补充: WebRTC 并不是一个“坏东西”,它本来就是视频通话等功能的重要技术。但如果你的网络架构本身依赖 VPN、代理或者其他隐私层,那么我认为关闭 WebRTC 是合理的额外收缩。【代价】就是:某些在线视频会议、实时通信网站会失去功能。所以在异常的时候请大家酌情开启。所以这并【不是】“所有人都必须关闭”。而是我的威胁模型下值得关闭。



(十二)URL 追踪参数:一个几乎没有理由不开的功能


user_pref("privacy.query_stripping.enabled", true);


这一项的目的比较简单:尽可能移除 URL 中已知的追踪参数。 Firefox 当前源码中已经把 Query Parameter Stripping 作为正式的隐私功能维护。它针对的是 URL 中常见的跟踪参数,而不是“把所有 URL 参数统统删除”。这个跟踪参数能对应到你的具体账号。网站为了跟踪这个链接如何被分享和你的社交关系等,加入这个。因此,这属于:隐私收益明确,通常兼容性成本较低。我认为这一项非常值得普通用户考虑。


(十三)Referer:我为什么没有直接照抄 Arkenfox


  这一部分是我自己的配置里最典型的“实测后推翻”。我原本更加激进:


user_pref("network.http.referer.XOriginPolicy", 2);


即最严格。


  但实际测试发现,一些网站,尤其是某些 Bilibili API 场景,会因为跨域 Referer 策略过于严格而出现问题,备注里也说了。所以我最终调整成:


user_pref("network.http.referer.XOriginPolicy", 0);

user_pref("network.http.referer.trimmingPolicy", 2);


这两个设置不要混为一谈。


前一个主要决定:跨域情况下是否发送 Referer。后一个主要决定:发送的时候发送多少。


于是我的思路变成:不要直接把 Referer 整个砍掉,而是尽量减少其中的信息量。这非常符合整套配置的思想:不追求“理论上最强”,而追求“实际上还能用”。而且这也是为什么我一直不建议读者直接复制别人配置。你根本不知道别人测试过什么网站。



 (十四)为什么我保留 WebGL 和 JavaScript


我的配置明确写着:


user_pref("webgl.disabled", false);

user_pref("dom.indexedDB.enabled", true);

user_pref("javascript.enabled", true);



  这一点很多“极端隐私教程”可能会反过来做。但是我没有。因为现代互联网大量依赖 JavaScript。WebGL 也仍然被很多网站使用。如果把这些功能全部关闭:银行、视频、地图、在线文档、复杂 Web App、图形应用、很多登录页面等。都有可能出问题。所以我把真正激进的设置统一放进了后面的“极端隐私 / Tor-like 预案”。而不是直接污染主实例。



(十五)WebGL 扩展:我为什么最后倾向于删除这一项


我的模板曾经加入:


user_pref("webgl.disable-extensions", true);


理论上看起来很好:关闭 WebGL 扩展枚举接口,减少 GPU 能力相关信息暴露。但后来我自己实际测试:在开启和关闭这一项的情况下,通过 JavaScript 调用 `getSupportedExtensions()`,得到的列表并【没有】出现我预期的差异。应该是抗指纹追踪帮我们一站式覆盖了。


  因此:我没有得到明确的实测隐私收益。这里非常重要。“听起来有隐私意义”和“实际产生可验证收益”不是一回事。因为关闭这个可能反而太特殊,被发现。所以目前更严谨的处理应该是:没有足够证据证明它值得偏离 Firefox 的默认行为,就不要为了心理上的“更安全”继续堆配置。这也是我后来逐渐形成的一个原则:没有证据的强化,不等于强化。



 (十六)为什么我没有继续魔改 Canvas / 图形后端


我以前也考虑过手动指定:


gfx.content.azure.backends


例如强制修改图形后端。


但后来实际测试 Canvas 输出时发现,RFP 本身就可能对 Canvas 读取结果引入随机噪声。且 RFP 开启后似乎网站看到的都是随机变化的 Canvas 指纹(我忘了,请大家指正)。于是:单次甚至少量测试根本不足以证明某一个图形后端更容易暴露指纹。既然如此,我最后反而选择:尽量维持 Firefox 默认值,让 RFP 兜底。这是我现在越来越认可的一条原则:当“修改”没有证据证明优于默认值时,默认值本身就是一个很重要的隐私资产。前面已经不断阐述。

  因为越多人使用相同或接近的默认行为,你越容易融入人群。



 (十七)剪贴板:我为什么没有把它彻底砍掉

我的配置是:



user_pref("dom.event.clipboardevents.enabled", true);

user_pref("dom.events.asyncClipboard.readText", false);

user_pref("dom.events.asyncClipboard.clipboardItem", true);

user_pref("dom.events.testing.asyncClipboard", false);

user_pref("dom.events.asyncClipboard.read", false);


  这里的思路是:尽量阻止网页主动读取剪贴板内容,但不要连正常的“复制、粘贴富内容”功能一起禁止。例如一些网站可能需要:粘贴图片、粘贴富文本、在线编辑器操作。我曾经因为太严格, Claude 、ChatGPT 网页无法复制粘贴进入图片到对话框。所以我后来又把部分功能恢复回来。

  这又是一个非常典型的例子:隐私保护的目标应该是减少网页“偷看”的能力,而不是把用户自己的正常操作一起影响。



 (十八)为什么我要保留一个“极端隐私 / Tor-like 预案”


我在模板最后专门保留了这一整组注释掉的设置。


例如:


// user_pref("javascript.enabled", false);


以及:


// user_pref("javascript.options.wasm", false);

// user_pref("javascript.options.ion", false);

// user_pref("javascript.options.baselinejit", false);


还有:


// user_pref("webgl.disabled", true);


以及:


// user_pref("dom.serviceWorkers.enabled", false);

// user_pref("dom.push.enabled", false);

// user_pref("dom.webnotifications.enabled", false);


甚至:


// user_pref("network.trr.mode", 3);


这些东西为什么全部注释?


  因为:它们不是“错误配置”,只是“不适合我的主实例”。比如关闭 JavaScript,确实可以大幅降低网页脚本攻击面和行为采集能力。但前面说了,现代互联网也基本跟着一起死了。关闭 WebGL,可以进一步减少 GPU 相关信息。但地图、3D、图形应用可能直接崩溃。关闭 Service Worker、Push、Web Notifications,同样会影响大量现代 Web App。


  所以这些配置真正适合的是:临时实例 profile、高风险网站、隐私测试、故障排查、或者你真的知道自己在干什么的时候。而【不是】:把我的主力浏览器永久改成半个 Tor Browser。那样反而太特殊,反而容易被发现。



 (十九)这份模板最重要的其实不是“改了多少”


看到这里,你可能会发现一个很有意思的现象:我的模板有很多设置,看起来非常激进。但实际上,它并不是单纯地:能关就关。它真正的逻辑是:


第一层:减少明显没有必要的网页能力


例如:WebRTC;地理位置;传感器;电池 API;部分硬件接口。


第二层:减少设备环境暴露


例如:RFP;Letterboxing;字体可见性;URL 参数剥离。




 第三层:提高网络安全


例如:HTTPS-Only;DoH;ECH;证书相关设置。




 第四层:保留日常使用能力


例如:JavaScript;WebGL;Firefox Sync;历史记录;会话恢复;搜索;Pocket;推荐内容;甚至赞助内容。



 第五层:把极端设置放到独立预案里

这样需要的时候可以快速启用。平时却不会破坏主实例。




(二十)我为什么宁愿维护一个“有理由的例外列表”


  这其实就是我使用 Arkenfox / Betterfox 的根本原因。不是因为它们替我完成所有工作。而是因为:它们负责提供一个经过长期维护的大框架,我负责决定自己的例外。


  Arkenfox 官方目前仍明确建议通过单独的 user-overrides.js 进行覆盖,而不是直接修改其主 user.js;因为更新时,个人 override 可以继续保留下来。


我的维护流程也是一样。每次更新模板后,我会比较:新的 Betterfox / Arkenfox;和我自己的 `user-overrides.js`到底发生了什么变化。这样我不会因为一次更新,就突然不知道:“为什么今天 Firefox 跟昨天不一样?”。



 (二十一)最后总结:我的配置实际上是在做什么?


如果一定要把这份配置压缩成一句话,我会这样概括:减少网页不必要的能力,减少设备指纹暴露,强化网络安全;但不为了追求“隐私最大化”而主动毁掉日常浏览器功能。


所以你会同时看到:关闭 WebRTC 、保留 WebGL 、关闭地理位置 API  、保留 JavaScript、限制字体暴露;和保留 Firefox Sync、开启 RFP;和允许 Mozilla 的推荐、赞助内容、开启 HTTPS-Only等。这些设置看起来互相矛盾。


  其实并不矛盾。因为:隐私加固【不是】“把所有开关都拨到最右边”。真正困难的地方,恰恰是判断:这一项隐私收益到底有多大?

这一项功能对我到底有多重要?

这个修改有没有经过实际测试?

它到底是在减少指纹,还是反而制造了一份更独特的浏览器配置?


  最终我越来越相信:好的 Firefox 隐私配置,不应该是最极端的配置,而应该是一套每一项修改都能说清楚“为什么”的配置。而这,也是我把自己的 `user-overrides.js` 单独写成这一篇的意义。前面几篇,我们一直在学习“Firefox 有哪些可以修改的东西”。这一篇开始,我希望讨论的是另外一个层次:我们为什么要修改它。


  这两件事情,其实完全不同。


发现错误、补充建议或有使用经验?欢迎到主站留言讨论。

💬 到主站参与讨论
本文镜像页浏览 39 次 · 离线下载 4 次 · 已有 9 人读完