在 Manifest V3 中提升安全性
這是最後一個部分,說明非擴充功能 Service 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。 - 偵錯工具擴充功能可以使用 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], });
在背景 Service Worker 中。
Chrome 擴充功能範例存放區包含可逐步執行的函式插入範例。如需 getCurrentTab() 範例,請參閱該函式的參照。
尋找其他解決方法
如果上述方法無法解決您的用途,您可能必須尋找替代解決方案 (即遷移至其他程式庫),或尋找其他使用程式庫功能的方式。舉例來說,如果是 Google Analytics,您可以改用 Google Measurement Protocol,而不使用官方遠端代管的 JavaScript 版本,詳情請參閱 Google Analytics 4 指南。
更新內容安全政策
"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 檔案和服務工作人員。
sandbox:指擴充功能使用的任何採用沙箱機制的擴充功能頁面。
移除不支援的內容安全政策
Manifest V3 不允許在 "extension_pages" 欄位中使用 Manifest V2 允許的特定內容安全政策值。具體來說,Manifest V3 禁止使用允許遠端執行程式碼的函式。script-src,、object-src 和 worker-src 指令只能有下列值:
selfnonewasm-unsafe-eval- 僅限未封裝的擴充功能:任何本機主機來源 (
http://localhost、http://127.0.0.1或這些網域上的任何通訊埠)
sandbox 的內容安全政策值沒有這類新限制。