[敲打鍵盤] 從 Firefox 擴充套件之戰談起

接下來這一篇是在 2009/05/06 刊登於自由軟體鑄造場電子報第 126 期的舊稿,內容也與當時的時事有關。

從 Firefox 擴充套件之戰談起

在眾多瀏覽器當中,Firefox 以其擴充性著稱;雖然 Firefox 本身功能少,但包羅萬象的擴充套件讓 Firefox 可以彌補各方面的不擅長,甚至能把 Firefox 包裝成不同功能目的的應用程式。這種設計並非全無缺失。最常見的情況是,使用者必須安裝數十個不同的擴充套件,結果補強功能的同時,也把整體效能拖累了;另一種常見的情況,則是擴充套件之間的相容性問題,不但讓網頁顯示結果變得奇怪、瀏覽器效能低落,而且還讓人難以判斷到底是誰(哪一個擴充套件)惹的禍。

最近才爆出一起 Adblock Plus 與 NoScript 這兩個擴充套件的糾紛事件。這兩個擴充套件應該都是 Firefox 愛用者耳熟能詳的;前者的功能是用來阻擋各種網站上的廣告,後者則是標榜預設禁用所有的 JavaScript,讓使用者能一一批准放行,以抵禦未知的不良網站攻擊。這兩個擴充套件看似井水不犯河水,但不少使用者發現瀏覽某些網站時,同時裝有這兩個擴充套件的 Firefox 會有異常的情況;也有不少使用者發現,啟用 NoScript 的情況下,瀏覽器整體速度變慢。這究竟是怎麼一回事呢?

Adblock Plus 的作者 Wladimir Palant 於五月一日在部落格上發表了一篇文章(http://adblockplus.org/blog/attention-noscript-users),指責 NoScript 的作者為了謀取廣告收入而不擇手段。該文大意如下:

「NoScript 為了營利,在更新說明網頁放置了大量廣告,並且頻繁改版,再強迫所有的使用者於每次更新後,都連到充斥廣告的更新說明網頁;雖然 NoScript FAQ 當中宣稱只有重大版本更新時才會連到該網頁,但實際上卻是每次更新都會連過去。」

「原本 NoScript 應該是預設阻擋所有的 JavaScript,但是為了要顯示 NoScript 更新說明網頁上的廣告,NoScript 內建了一組預設白名單,讓 NoScript 網頁的網域,及其他用來顯示 NoScript 網頁廣告的網域,一開始就能執行。這個設置讓有心人士能夠從 NoScript 更新說明網頁執行 XSS 攻擊,使用者在剛安裝或更新 NoScript 後就會第一時間中招。」

「此外,為了阻擋 NoScript 更新說明網頁上的廣告,Adblock Plus 的 EasyList 於兩週前開始加入了一些規則,用來擋掉這些廣告。接下來 NoScript 與 Adblock Plus 展開了一連串的戰役;NoScript 開始在其更新說明網頁上運用各種手段來避開 EasyList,EasyList 也不斷地修改其規則,繼續阻擋 NoScript 更新說明網頁上的廣告。一週前,新版的 NoScript 擴充套件加入了一些針對 Adblock Plus 的惡意程式碼,用來干擾及停用 Adblock Plus 的部份功能。因此,在 NoScript 網頁及許多其他網域當中,若使用者同時安裝了這兩個擴充套件,網頁顯示就會不正常。」

「由於 NoScript 此舉已經侵犯了 Mozilla 的附加元件政策,因此 NoScript 的作者同意移除該版本 NoScript 擴充套件當中針對 Adblock Plus 擴充套件所加入的惡意程式碼;但是在四月底所釋出的新版 NoScript 擴充套件中,運用了 Adblock Plus 的應用程式介面,在未經使用者同意的情況下,逕自加入一份 Adblock Plus 過濾規則清單,此清單也會把 NoScript 網頁及其他用來顯示 NoScript 網頁廣告的網域,列入白名單。NoScript 的網頁上並宣稱『因為 EasyList 意圖攻擊 (NoScript) 開發者的網站,使得許多功能爛掉,所以才加入這份白名單』;實際上 EasyList 完全沒有攻擊可言,而是單純地阻擋網頁廣告而已。NoScript 網頁意圖規避 Adblock Plus 及 EasyList 才是造成所謂『不相容』的主因。這份 NoScript 擴充套件所加入的 Adblock Plus 過濾規則清單不但在加入時不會先取得使用者同意,而且也只能停用而無法移除⸺使用者若嘗試移除這份過濾清單,它仍會在下次啟動 Firefox 時自動加回去;即便是在移除整個 NoScript 擴充套件後,這份清單仍然存在。」

針對這樣的指責,NoScript 的作者 Giorgio Maone 五月四日在其部落格上發表了一篇更長的文章(http://hackademix.net/2009/05/04/dear-adblock-plus-and-noscript-users-dear-mozilla-community/),除了再三道歉、承認自己愧對了整個 Mozilla 社群的信任,是個天大的錯誤,永遠會對此感到懊悔。他並承認自己濫用了多年來整個社群對 NoScript 的信任,在未經使用者同意之下,讓 Adblock Plus 無法阻擋四個網域(noscript.net、flashgot.net、informaction.com、hackademix.net)中的內容。

Giorgio Maone 並宣稱其所逕自加入的 Adblock Plus 過濾規則清單無法移除乃是程式瑕疵,非其本意,緊接著釋出的 NoScript 擴充套件 1.9.2.6 版當中,亦會自動移除前述的 Adblock Plus 過濾規則清單(也不會先詢問使用者)。另外還有不少技術細節,一方面 Giorgio Maone 持續地承認自己犯的過錯沒得找藉口,另一方面也在試著表達自己並不如 Wladimir Palant 所說的那般邪惡;兩人之間對於「廣告」與「阻擋廣告」的認知略有出入,並且在互動之中或多或少都混雜著個人情感。

這並非 Firefox 擴充套件間的第一場紛爭,也不會是最後一場。或者說,在某個層面上,Firefox 這種仰賴擴充套件的作法,正是促成了種種競爭的原因之一。

在這個案例上,顯現了幾個不同的議題。首先是關於安全性的考量,開放源碼與否很難說誰比較安全⸺開放源碼軟體如 Firefox 的各種擴充套件並不見得因為「源碼大家都看得到」就不會含有惡意程式碼,有心人反而可能利用競爭對手的源碼,針對特定對象撰寫惡意程式碼;不過開放源碼的結果,是這些不安好心的勾當,也確實比較有機會被及時挖掘出來。受到夠多人的關注時,這些惡意程式碼就能迅速移除。

佈署開放源碼解決方案時,有個容易忽略的成本⸺必須要有夠多眼睛來監督這些源碼,才能保持程式品質與可靠。除了直接掌握程式源碼所需的人力外,還有每個元件的更新、佈署、確認元件間相容性等;使用者社群在這當中扮演著重要的角色,但是社群的努力並不能當做某種國際標準規範,而且要獲得社群協助前,也得要參與社群運作。這並不是開放源碼解決方案的「缺失」,而是一種「特色」。任何開放源碼專案都必須要有充分的社群參與,才能清新、健康地發展;當考慮要採用開放源碼解決方案時,跟著參與相關的社群(使用者社群以及開發者社群),纔是開放源碼解決方案的正確「用法」。

另一個議題則是 Firefox 這種「核心功能單純,開放肆意擴充」的策略,究竟帶給使用者更多方便還是困擾,也很難定論。從好的角度來看,這種設計確實可以顧到比較多樣需求的使用者社群,不管有多奇怪的需求、想把瀏覽器改裝成怎樣的怪獸,都有辦法達成;當然從不好的角度來看,就是為了達成這些目的⸺即使是多數使用者期待的日常使用功能⸺都需要使用者主動了解諸多擴充套件,並且從各式各樣的擴充套件中選擇搭配。如果使用者沒有這方面的知識,就無法讓瀏覽器成為順手的利器。

而在這種不斷安裝擴充套件的過程中,也可能讓整個瀏覽器變得肥大,或者是遇到前述的相容性(甚至是互相打架)的情況;由於許多這類的軟體專案都是由少數幾個人獨挑大梁,相較之下程式開發比較容易受到一時的想法或情緒左右,導致如前述 NoScript 事件這樣的結果。如果擴充套件的作者因故停止維護擴充套件,在瀏覽器主程式推出新版本時,相關的功能就可能因此擱置,不見得有人能有意願/時間/精力接手經營。Firefox 歷經 1.0、1.5、2.0、3.0 等多次重大改版,已經有許多難以取代的擴充套件就這麼消失了。

這並不是「開放源碼」的錯⸺任何封閉軟體也可能發生一樣的狀況,隨著公司倒閉、程式設計師跑路、硬碟損毀等事故,都可能造成乏人維護的程式。但實情是,開放源碼軟體依舊會斷頭(停止開發),使用者依舊會陷於其中,不知所措。以 Firefox 的情況來說,不少使用者面臨著某些靠著擴充套件功能,陸陸續續地消失或壞掉,而且求助無門;對一般使用者來說,不同版本的 Firefox 更像是不同的瀏覽器,有不同的設計、不同的功能、不同的瑕疵、需要搭配不同的擴充套件。說真的,掌握這些細節並不是件輕鬆的事。

開放源碼提供一條生路,讓人們可以自由檢閱、修改、使用、延續這些程式碼,但並不保證這些事項一定會發生;開放源碼也提供了多元選擇的機會,讓完成事情的辦法可以不只有一種,但不保證這些選擇當中存在最佳解。整個開放源碼史,也是眾多開發者與使用者的磨合、互動歷程。

在開放源碼軟體的世界中,「人」纔是真正的核心價值所在。不論是程式開發者或是使用者,都是構成社群的重要角色;積極地參與社群,與其他人理智地交流互動,最終才能在源碼當中累積眾人的智慧,讓源碼生生不息。

jedi.org: