最近一年,寫(xiě)過(guò)好幾篇涉及“Web 安全”的博文。這些博文或多或少都會(huì )提及“Firefox 的定制”??紤]到某些讀者對這方面不太了解,單獨寫(xiě)一篇掃盲。
如果你從來(lái)不用 Firefox 瀏覽器,本教程就不用看了(以免浪費時(shí)間)。
本文主要面向不太熟悉 Firefox 的菜鳥(niǎo);對于 Firefox 的老鳥(niǎo),頂多只需要看“高級話(huà)題”相關(guān)的章節。
★預備知識
◇“瀏覽器實(shí)例”(profile)是啥?
Firefox 支持【多實(shí)例】(多個(gè) profile)。你可以把“profile”這個(gè)概念通俗理解為:“獨立的瀏覽器環(huán)境”。
也就是說(shuō),實(shí)例之間是【互相隔離】滴,每個(gè)實(shí)例都有自己【獨立的】“書(shū)簽、瀏覽歷史、下載歷史、cookies ......”
就算你從來(lái)沒(méi)有創(chuàng )建過(guò)實(shí)例,只要你通過(guò) Firefox 上網(wǎng),你的 Firefox 至少會(huì )有一個(gè)實(shí)例(也就是你正在用的這個(gè))。
◇如何找到當前實(shí)例的目錄?
每個(gè)實(shí)例(profile)都對應一個(gè)目錄,屬于該實(shí)例的那些東西(書(shū)簽、瀏覽歷史、下載歷史、cookies ...)全都存儲在該目錄下。
要想查看你正在使用的 Firefox 實(shí)例對應的目錄,很簡(jiǎn)單:
1. 在瀏覽器地址欄輸入 about:support 然后敲回車(chē)
2. 這時(shí)候會(huì )顯示一個(gè)支持頁(yè)面,其中有一項 Profile Directory(俺用的是英文版,中文版的叫法略有不同),對應的就是【當前實(shí)例的目錄】。
★掃盲“配置選項”(Preferences)
◇啥是“配置選項”?
“配置選項”也叫“首選項”,洋文稱(chēng)之為“Preferences”。
通俗地說(shuō)就是:Firefox 提供了一大堆可供用戶(hù)定制的參數。通過(guò)修改這些參數,可以對 Firefox 進(jìn)行【全方位】定制。
每個(gè) Preference 包含如下幾個(gè)要素:
名稱(chēng)
每個(gè) Preference 的名稱(chēng)必定是【唯一】滴。
“名稱(chēng)”由英文單詞構成,單詞之間以“小數點(diǎn)”或“下劃線(xiàn)”分隔。
數據類(lèi)型
Preferences 的“數據類(lèi)型”必須是“布爾型、整數型、字符串型”這三者之一。
“布爾型”的值只能是 true 或 false。
“整數型”的值可以是負數。
默認值
每個(gè) Preference 都有個(gè)“默認值”。
“默認值”包含在 Firefox 的安裝包里面。
絕大多數用戶(hù)并【不需要】去修改“默認值”。
?。ㄗⅲ簶O少數有此需求的讀者,可以去本文的高級話(huà)題——autoconfig這個(gè)章節)
當前值
每個(gè) Preference 都對應某個(gè)“當前值”。
當你修改 Preference 的時(shí)候,修改的就是它的“當前值”。
一開(kāi)始的時(shí)候,每個(gè) Preference 的“當前值”就等于它的“默認值”;如果該 Preference 被定制了(修改了),其“當前值”與“默認值”就有可能不同。
◇誰(shuí)可以修改“配置選項”?
首先,Firefox 的用戶(hù)當然可以修改配置選項(具體如何做,后續章節會(huì )細聊)
除了用戶(hù),【瀏覽器擴展】也可以添加或修改“配置選項”。某些擴展會(huì )提供定制界面,讓用戶(hù)設定某些參數。這些參數也保存在瀏覽器的 Preference 里面。
有必要強調一下:網(wǎng)站上的 JS 是【無(wú)法修改】Preference 滴!
道理很簡(jiǎn)單:因為 Firefox 的 Preference 中保存了很多與安全性相關(guān)的配置參數。如果允許網(wǎng)站的 JS 修改這些參數,將會(huì )成為巨大的安全隱患。
◇為啥要修改“配置選項”?
俺總結下來(lái),大致有如下幾種需求:
1. 安全加固
你可以通過(guò)定制很多的 Preferences 以大大強化 Firefox 的安全性(包括隱私防護能力)。
每次 Firefox 的新版本增加了某個(gè)比較重要的安全相關(guān)的定制選項,俺會(huì )在每季度的《近期安全動(dòng)態(tài)和點(diǎn)評》提醒大伙兒。
2. 性能優(yōu)化
通過(guò)定制 Preference 可以?xún)?yōu)化性能(包括:“網(wǎng)絡(luò )傳輸、內存使用、界面渲染”等方面)
3. 易用性
通過(guò)定制 Preference,你還可以改進(jìn) Firefox 界面的易用性。
★“about:config”界面
◇進(jìn)入界面
修改 Firefox 的 Preference,最簡(jiǎn)單的方式就是“about:config”界面了。
你在瀏覽器地址欄輸入 about:config 然后敲回車(chē),就進(jìn)入該界面。
?。ㄌ嵝岩幌拢捍蜷_(kāi)該界面時(shí),你可能會(huì )看到一個(gè)警告提示,別慌張)
“about:config”界面主要是個(gè)的表格,共4列,分別是:
第1列:Preference 的“名稱(chēng)”
第2列:Preference 的“狀態(tài)”(如果顯示“default”表示該 Preference 還沒(méi)被修改過(guò),顯示“modified”表示已經(jīng)被改過(guò))
第3列:Preference 的“數據類(lèi)型”
第4列:Preference 的“當前值”
◇【篩選/過(guò)濾】Preferences
該界面默認會(huì )列出 Firefox【所有的】Preference(成百上千個(gè))。某些菜鳥(niǎo)一看到這個(gè)架勢,可能會(huì )有點(diǎn)暈。
別慌,界面上方有一個(gè)搜索框,可以幫你進(jìn)行【篩選/過(guò)濾】。
該搜索框針對 Preference 的名稱(chēng)進(jìn)行【模糊匹配】。比如說(shuō):你在搜索框中輸入 network,那么界面上就只列出名稱(chēng)中包含 network 的那些 Preferences。
◇【修改】某個(gè) Preference 的值
對于“布爾型”的 Preference,你雙擊 Preference 所在的這行,就可以修改它的“當前值”(在 true 與 false 之間切換)
對于其它數據類(lèi)型,雙擊 Preference 所在的行,會(huì )彈出一個(gè)對話(huà)框,讓你輸入【新的】數值。
◇【重置】某個(gè) Preference 的值
所謂的“重置”(reset)就是指“恢復默認值”。
?。▽τ谝呀?jīng)被改過(guò)的 Preference)選中它所在的那行;點(diǎn)右鍵;在快捷菜單上有一項“Reset”(重置);使用這個(gè)菜單項就可以把該選項重新恢復成默認值。
◇【添加】一個(gè)新的 Preference
在“about:config”界面的表格上點(diǎn)右鍵;在快捷菜單上有一項“New”(新增);可以讓你添加一個(gè)新的 Preference。
添加時(shí)會(huì )讓你指定新 Preference 的“名稱(chēng)”和“數值”。
◇一個(gè)小小的練習——如何去掉“about:config”界面的警告
你在“about:config”界面的搜索框中輸入 general.warnOnAboutConfig,此時(shí)只會(huì )過(guò)濾出一個(gè) Preference,這個(gè) Preference 是“布爾型”。當它的值是 true,每次你打開(kāi)“about:config”界面都會(huì )顯示警告提示;反之,則不顯示。
你可以修改這個(gè) Preference 的值。修改之后再【重新打開(kāi)】“about:config”界面,體會(huì )一下效果。
★“prefs.js”配置文件
◇功能簡(jiǎn)介
每個(gè) Firefox 實(shí)例中都有名為 prefs.js 的配置文件。這個(gè)文件保存了當前實(shí)例中【所有】Preferences 的設置。
◇文件位置
該文件位于每個(gè)【實(shí)例目錄】下。
◇文件格式
該文件的擴展名是 .js,說(shuō)明其內容是 javascript 語(yǔ)法。
在 javascript 語(yǔ)法中,任何一行中如果出現【雙斜杠】// ,那么“從雙斜杠一直到行尾”都算【注釋】;另外,包含在 /* 和 */ 之間的內容也是【注釋】。(注:第二種注釋可以跨越多行)
除了注釋之外,該文件的每一行有效代碼對應一個(gè) Preferences。文件中的每個(gè)有效代碼行全都是如下這個(gè)樣子:
user_pref("配置項名稱(chēng)", 配置項數值);
由于每一個(gè) Preferences 的名稱(chēng)都是字符串,因此上述代碼中的 配置項名稱(chēng) 總是包含在【半角引號】中。
如果某個(gè) Preferences 的數據類(lèi)型屬于“字符串型”,那么上述代碼中的“配置項數值”也要包含在【半角引號】中;否則,就不需要使用引號。
◇注意事項?。?!
【不要】直接修改 prefs.js 文件?。?!
如果你想通過(guò)【配置文件】的方式定制 Firefox 的 Preferences,請使用【user.js】(參見(jiàn)下一個(gè)章節)。
★“user.js”配置文件
◇功能簡(jiǎn)介
Firefox 使用名為 user.js 的文件對 Preferences 進(jìn)行個(gè)性化定制。
◇文件位置
該文件位于【實(shí)例目錄】下。請注意:默認情況下【沒(méi)有】這個(gè)文件!
如果你想用這種方式定制 Firefox,需要在【當前實(shí)例】的目錄下【手動(dòng)創(chuàng )建】該文件,然后往這個(gè)文件中添加代碼。
◇文件格式
該文件的格式與 prefs.js 相同。具體介紹參見(jiàn)“前一個(gè)章節”。
◇配置舉例
前面介紹“about:config”界面時(shí),已經(jīng)讓你做了一個(gè)小小的練習。
現在,咱們在“user.js”中繼續進(jìn)行這個(gè)練習——
當你創(chuàng )建好一個(gè)空的 user.js 文件,在文件中添加如下代碼,并存盤(pán)。
user_pref("general.warnOnAboutConfig", false);
?。ㄗⅲ荷鲜龃a中的“括號、引號、逗號、分號”必須都是【半角符號】)
上述文件存盤(pán)之后,你把 Firefox 重新啟動(dòng),然后再打開(kāi)“about:config”界面,這時(shí)候就不會(huì )再有那個(gè)討厭的警告信息了。
◇【重置】某個(gè) Preference 的值
如果你已經(jīng)在“user.js”中修改過(guò)某個(gè) Preference,之后又想恢復其默認值。請參照如下步驟:
1. 先在“user.js”中把這個(gè) Preference 的配置“刪除”或“注釋掉”;
2. 重啟瀏覽器;
3. 再到“about:config”界面進(jìn)行重置操作。
◇注意事項?。?!
當你要通過(guò)這種方式修改某個(gè)選項,先搞清楚這個(gè)選項的含義和用途,并了解可能的【副作用】。
★上述三種配置方式的【原理】
◇加載配置
當 Firefox 啟動(dòng)的時(shí)候,會(huì )讀取 user.js 和 prefs.js,拿到這兩個(gè)文件中的 Preferences 配置,并保存在內存中。
如果發(fā)現這兩個(gè)文件的配置有沖突,以 user.js 為準(也就是說(shuō):“user.js 的配置”會(huì )覆蓋“prefs.js 的配置”)。
如果同一個(gè)配置項在某個(gè)文件中出現多次,后面的代碼行會(huì )覆蓋前面的代碼行。
◇修改配置
當你打開(kāi)“about:config”界面,Firefox 會(huì )把內存中的 Preferences 信息顯示給你看。
如果你在這個(gè)界面上進(jìn)行了修改,修改的結果會(huì )保存在內存中,同時(shí)也會(huì )保存到 prefs.js 文件中。
另外,Firefox【不會(huì )】去修改你用于定制的 user.js 文件。
★高級話(huà)題——autoconfig
“高級話(huà)題”是專(zhuān)門(mén)針對“Firefox 老鳥(niǎo)”,尤其是那些具有“geek 精神”(善于折騰)的用戶(hù)。
?。ㄊ煜け静┛偷淖x者應該知道:俺一向鼓勵【折騰】,并寫(xiě)過(guò)一篇博文《聊聊【折騰】的重要性》)
至于菜鳥(niǎo)嘛,先搞定前面章節介紹的內容,學(xué)會(huì )怎么用“user.js”;然后再考慮本文的“高級話(huà)題”。
考慮到本章節的特點(diǎn),“高級話(huà)題”的介紹只是【點(diǎn)到為止】——對于【善折騰】的讀者,俺只需給出一個(gè)方向,他們自然能沿著(zhù)這個(gè)方向走得足夠遠。
◇“user.js”的局限性
通過(guò)“user.js”,雖然可以讓你定制每一個(gè) Preference;但至少有如下局限性:
局限性1——【無(wú)法】修改某個(gè) Preference 的【默認值】
請注意:在 user.js 中修改的是【當前值】。不管“當前值”如何變,“默認值”【沒(méi)】變。
在某些特殊場(chǎng)合,你可能想要定制 Preference 的【默認值】。
局限性2——【無(wú)法】鎖定某個(gè) Preference
所謂的“鎖定”就是“禁止修改”的意思。
比如說(shuō):某個(gè)第三方擴展會(huì )修改某個(gè) Preference 的值;但你又不希望這個(gè) Preference 被修改。這時(shí)候就可以把這個(gè) Preference【鎖定】。
◇比“user.js”更牛逼的【autoconfig】
Firefox 的擴展能力及其強大,當然能滿(mǎn)足上述這些怪異的需求。
Mozilla 提供了名為【autoconfig】的機制,可以更進(jìn)一步地定制 Preference。具體參見(jiàn) Mozilla 官網(wǎng)的“這篇教程”(洋文)。
在 user.js 中,咱們只能使用 user_pref 這個(gè)函數;而在【autoconfig】這種定制方式中,還提供了更多的函數,至少包括如下(代碼中綠色的部分是注釋?zhuān)?/span>
defaultPref("配置項名稱(chēng)", 配置項數值); // 該函數用于:定制配置項的【默認值】
lockPref("配置項名稱(chēng)", 配置項數值); // 該函數用于:設置配置項的默認值并【鎖定】
unlockPref("配置項名稱(chēng)"); // 該函數用于:【解鎖】配置項
clearPref("配置項名稱(chēng)"); // 該函數用于:把配置項的【當前值】恢復為【默認值】
★高級話(huà)題——定制“omni.ja”
◇“autoconfig”的局限性
“autoconfig”雖然比“user.js”更牛逼,但其能力只局限于 Preference 相關(guān)的定制。
有些你想定制的東西(比如:默認的鍵盤(pán)快捷鍵)【并不】保存在 Preference 中——也就是說(shuō),即便你去搗鼓“autoconfig”也【搞不定】!這時(shí)候就要引入【終極大殺器】——直接修改【omni.ja】。
順便插一句:
自從 Firefox Quantum(Firefox 57)之后,舊的“XPCOM 擴展機制”已經(jīng)淘汰,換成新的“WebExtensions 擴展機制”。但是,“新擴展機制”的功能比原來(lái)要弱(據說(shuō)是為了安全性的考慮)。比如:對“鍵盤(pán)快捷鍵”的定制能力就變弱了。
在這種情況下,“定制 omni.ja”的優(yōu)勢就更加明顯——因為它能做到“用擴展無(wú)法完成的事情”。
◇比“autoconfig”更強大的【omni.ja】
Firefox 是一個(gè)很復雜的開(kāi)源項目,代碼量超大。它的核心代碼(比如:渲染引擎、JS 引擎)是基于 C++ 語(yǔ)言開(kāi)發(fā)(并在逐步遷移到 Rust 語(yǔ)言)。而軟件界面(UI)相關(guān)的部分,大體上還是 Web 那套東西(不外乎就是:XML、JS、JSON、CSS ...)。
這些與 UI 相關(guān)的東西,大部分都打包在(安裝包自帶的)omni.ja 文件中。如果你摸透了 omni.ja 的結構,就可以對 Firefox 的界面進(jìn)行任意定制。
說(shuō)到這里,某些熟悉 Firefox 的用戶(hù)會(huì )反問(wèn):為啥不用 userChrome.css 定制 Firefox?
這個(gè)東東俺當然知道(而且還寫(xiě)過(guò)專(zhuān)門(mén)的教程,鏈接在“這里”)。但它的能力很【有限】——只能修改 CSS 樣式,【無(wú)法】定制界面的功能。
舉個(gè)【簡(jiǎn)單】例子:
比如說(shuō) Firefox 的默認快捷鍵中,【Ctrl + q】會(huì )退出整個(gè)進(jìn)程;
如果你不喜歡這個(gè)快捷鍵,可以換成一個(gè)更順手的(通過(guò)修改 omni.ja 里面的 chrome/en-US/locale/browser/browser.dtd)
舉個(gè)【復雜】例子:
或許很多 Firefox 用戶(hù)不知道——你可以用【Alt + 數字鍵】或【Ctrl + 數字鍵】來(lái)切換 Firefox 的標簽頁(yè)。
?。ㄗⅲ喊吃?Linux 用的是 Alt,而 Windows 環(huán)境用的是 Ctrl)
當你在 Firefox 界面上按了這個(gè)組合鍵,會(huì )觸發(fā)某個(gè) JS 代碼,然后由這個(gè) JS 代碼來(lái)改變當前標簽頁(yè)的狀態(tài)。
而這段 JS 代碼就包含在 omni.ja 這個(gè)壓縮包的某個(gè)文件中(chrome/browser/content/browser/browser.xul)。如果你能修改這段 JS 代碼,就可以實(shí)現自己想要的某些效果。
友情提醒:
安裝好的 Firefox 有【兩個(gè)】 omni.ja ——大的那個(gè)有30多兆,小的那個(gè)有十多兆。
當你要折騰的時(shí)候,別搞錯了?。?!
比如說(shuō):當俺在折騰鍵盤(pán)快捷鍵時(shí),修改的是【大的】那個(gè)。
◇簡(jiǎn)述“omni.ja”的格式
如何“解壓縮”?
雖然 omni.ja 的擴展名是 .ja,但其實(shí)是個(gè) zip 壓縮包;但它又【不是】標準的 zip 壓縮包——因為它的文件頭有點(diǎn)特殊。
俺在 Linux 下用 unzip 命令進(jìn)行解壓縮,完全 OK(使用 Mac OS 的同學(xué)也可以用這個(gè)命令);
對于使用 Windows 的同學(xué),(Mozilla 官網(wǎng)的文檔建議)先把擴展名改為 .zip 再用資源管理器自帶的解壓功能(注:其它解壓 zip 的工具不一定能行)。
如何“壓縮(重新打包)”?
當你【修改完】omni.ja 內部的文件之后,要【重新打包】該文件。
對于 POSIX 環(huán)境(Linux & UNIX),Mozilla 官網(wǎng)的文檔建議使用如下命令:
zip -qr9XD omni.ja *
◇定制“omni.ja”的注意事項
簡(jiǎn)單說(shuō)幾個(gè)注意事項:
第1條
omni.ja 內部的文件很多。只修改那些【你有把握】的文件。
如果你把 omni.ja 內部的某些文件改壞了,可能會(huì )導致 Firefox 無(wú)法啟動(dòng),而且也沒(méi)有任何報錯信息。
第2條
每次修改完 omni.ja,為了讓你的修改生效,要記得:先退出 Firefox【進(jìn)程】;然后清空整個(gè)緩存目錄;最后再啟動(dòng) Firefox。
第3條
由于每次修改完都要做“打包、清緩存、重啟 Firefox”這幾件事情。俺建議:搞個(gè)命令行腳本幫你自動(dòng)干這些事兒,以提升效率。
第4條
omni.ja 會(huì )隨著(zhù) Firefox 的版本而變化。也就是說(shuō),每次有新版本,你還需要在新版本上再修改一次。
如果結合第3條與第4條,你更應該寫(xiě)一個(gè)腳本,幫你【自動(dòng)化】完成整個(gè)定制流程。
聯(lián)系客服