Kent Shen
← 所有文章

寫 Chrome 外掛的四個習慣:最小權限、不信任頁面內容、資料留在本機

  • Chrome 外掛
  • Manifest V3
  • 資安

Chrome 外掛擁有的權力很大:它能讀取你正在看的網頁、修改畫面、甚至代替你送出請求。所以寫外掛的人責任也比一般網頁開發者重。我做過幾個外掛,下面是我一直遵守的四個習慣。

習慣一:只申請必要的權限

Manifest V3 要求你在 manifest.json 裡宣告外掛需要的權限與可存取的網站。最偷懶的做法,是申請「所有網站」的存取權,這樣什麼都能做,但使用者安裝時會看到「可以讀取並變更您在所有網站上的資料」,這個警告很嚇人,而且是理所當然的。

我的做法是反過來:外掛要做什麼,才申請什麼。

  • 租屋比價外掛只在租屋網站的列表頁執行。
  • Threads 雷達只在 Threads 的網域執行,另外只多申請一個分析服務的連線權限。
  • 儲存設定只用 storage 權限。

權限越少,使用者越放心,審核時也越不容易被擋下。

習慣二:頁面上的內容一律當成不可信

外掛的內容腳本(content script)會讀取別人網頁上的文字,再畫出自己的介面。這些文字不是我寫的,可能是任何人貼的。

如果直接用 innerHTML 把抓到的文字塞回頁面,惡意內容就可能夾帶腳本。所以我一律用 createElement 建立元素,再用 textContent 設定文字,讓內容永遠只會被當成純文字。我寫了一個小小的輔助函式處理這件事,所有外掛都共用同樣的寫法。

習慣三:資料留在本機

我的外掛處理的是使用者正在看的內容,例如他們的歌單、搜尋的房子、瀏覽的帳號。這些資料沒有理由離開使用者的電腦。

  • 歌詞外掛的假名標註,是用瀏覽器端的分詞工具在本機完成的,不呼叫任何外部服務。
  • 變調與消除人聲,用瀏覽器的 Web Audio 在本機即時處理,不上傳音訊。
  • 使用者的偏好設定,存在瀏覽器自己的儲存空間。

需要連到外部服務的功能(例如查詢歌詞資料庫、翻譯),我會在說明文件裡明確寫出會連去哪裡、送出什麼。

習慣四:誠實說明限制,因為外掛很脆弱

外掛依賴的是別人網站的畫面結構。網站一改版,外掛可能就壞了。所以我會做兩件事:

  • 解析失敗時,明確顯示「缺少哪個欄位」,不去猜一個數字。猜錯的資料比沒有資料更糟。
  • 把容易變動的部分,例如要過濾掉的按鈕文字、網站的 CSS 類別名稱,集中在程式開頭,改版時只需要改一個地方。

另外,所有外掛的 README 都有一節「已知限制」,直接寫出哪些情況會失靈。使用者先知道限制,遇到問題時才不會覺得被欺騙。

小結

寫外掛的心態,我歸納成一句話:你是被邀請進入使用者的瀏覽器,行為要像一位有禮貌的客人。 少拿一點、少看一點、不亂動東西,離開時什麼都不留下。這樣才會有人願意安裝,也才會有人持續使用。