提升 Manifest V3 的安全性
這是三個部分的最後一節,說明不屬於擴充功能服務 Worker 的程式碼需要變更。本文說明瞭如何提升擴充功能安全性所需的變更。其他兩個部分則介紹升級至 Manifest V3 時所需的更新程式碼,以及取代封鎖網路要求的方式。
移除任意字串的執行作業
您無法再使用 executeScript()
、eval()
和 new Function()
執行外部邏輯。
- 將所有外部程式碼 (JS、Wasm、CSS) 移至擴充功能套件中。
- 更新指令碼和樣式參照,以便從擴充功能套件載入資源。
- 在執行階段使用
chrome.runtime.getURL()
建構資源網址。 - 使用沙箱 iframe:在沙箱 iframe 中仍支援
eval
和new Function(...)
。詳情請參閱沙箱 iframe 指南。
executeScript()
方法現在位於 scripting
命名空間,而非 tabs
命名空間。如要瞭解如何更新通話,請參閱「移動 executeScript()
」。
在某些特殊情況下,仍可執行任意字串:
- 使用 InsertCSS 在網頁上插入遠端代管的樣式表
- 針對使用
chrome.devtools
的擴充功能:inspectWindow.eval 可讓您在檢查的網頁環境中執行 JavaScript。 - Debugger 擴充功能可以使用 chrome.debugger.sendCommand 執行偵錯目標中的 JavaScript。
移除遠端代管的程式碼
在 Manifest V3 中,所有擴充功能的邏輯都必須是擴充功能套件的一部分。根據 Chrome 線上應用程式商店政策,您無法再載入及執行遠端代管的檔案。例如:
- 從開發人員伺服器提取的 JavaScript 檔案。
- 任何託管於 CDN 的程式庫。
- 包含動態擷取遠端代管程式碼的第三方程式庫。
視您的用途和遠端託管的原因而定,可能有其他替代方法。本節將說明參考方法。如果無法順利處理遠端代管的程式碼,請參閱這份指南。
設定導向的功能和邏輯
擴充功能會在執行階段載入及快取遠端設定 (例如 JSON 檔案)。快取設定會決定要啟用的功能。
使用遠端服務的外部化邏輯
您的擴充功能會呼叫遠端網路服務。這可讓您將程式碼保持不公開,並視需要修改,同時避免重複重新提交 Chrome 線上應用程式商店。
在沙箱 iframe 中嵌入遠端代管的程式碼
遠端代管的程式碼可在沙箱 iframe 中支援。請注意,如果程式碼需要存取嵌入網頁的 DOM,此方法便不適用。
封裝第三方程式庫
如果你使用先前從外部伺服器載入的 React 或 Bootstrap 等熱門架構,即可下載這類檔案,然後新增至專案並在本機匯入。例如:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
如要在 Service Worker 中加入程式庫,請在資訊清單中將 "background.type"
鍵設為 "module"
,並使用 import
陳述式。
在分頁插入的指令碼中使用外部程式庫
您也可以在執行階段載入外部程式庫,只要在呼叫 scripting.executeScript()
時將外部程式庫加入 files
陣列即可。您仍可在執行階段從遠端載入資料。
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
插入函式
如果您需要更多元精,可以在 scripting.executeScript()
中透過新的 func
屬性插入函式做為內容指令碼,並使用 args
屬性傳遞變數。
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; chrome.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
Chrome 擴充功能範例存放區內含可逐步執行的函式插入範例。getCurrentTab()
的範例請見該函式的參考資料。
尋找其他解決方法
如果這些方法無法說明您的用途,您可能需要尋找替代解決方案 (例如遷移至其他程式庫),或尋找其他程式庫功能的使用方式。舉例來說,如果是 Google Analytics (分析),可以改用 Google Measurement Protocol,而不要使用 Google Analytics (分析) 4 指南中的官方遠端代管的 JavaScript 版本。
更新內容安全政策
"content_security_policy"
尚未從 manifest.json
檔案中移除,但現在是支援 "extension_pages"
和 "sandbox"
的字典。
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages
:是指擴充功能中的結構定義,包括 HTML 檔案和 Service Worker。
sandbox
:是指擴充功能使用的所有沙箱擴充功能頁面。
移除不支援的內容安全政策
Manifest V3 禁止 Manifest V2 在 "extension_pages"
欄位中允許的特定內容安全性政策值。具體來說,Manifest V3 會禁止允許遠端程式碼執行的項目。script-src,
object-src
和 worker-src
指令只能使用下列值:
self
none
wasm-unsafe-eval
- 僅限未封裝的擴充功能:任何 localhost 來源 (
http://localhost
、http://127.0.0.1
或這些網域上的任何通訊埠)
sandbox
的內容安全政策值沒有這類新限制。