提升擴充功能安全性

改善 Manifest V3 的安全性

下方是最後三個部分,說明對非擴充功能 Service Worker 的程式碼所需的變更。說明改善擴充功能安全性所需的變更。另外兩個章節將說明昇級至 Manifest V3 及取代封鎖網路要求所需的程式碼

移除任意字串的執行作業

您無法再使用 executeScript()eval()new Function() 執行外部邏輯

  • 將所有外部程式碼 (JS、Wasm、CSS) 移至擴充功能套件。
  • 更新指令碼和樣式參照,從擴充功能套件載入資源。
  • 使用 chrome.runtime.getURL() 在執行階段建構資源網址。
  • 使用沙箱 iframe:沙箱 iframe 仍支援 evalnew Function(...)。詳情請參閱沙箱 iframe 指南

executeScript() 方法現在位於 scripting 命名空間,而非 tabs 命名空間。如要瞭解如何更新呼叫,請參閱移動 executeScript()

不過,在某些特殊情況下,執行任意字串仍是可行的:

移除遠端代管的程式碼

在 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">

如要在服務工作者中加入程式庫,請在資訊清單中將 "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 屬性傳遞變數。

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

在背景指令碼檔案中。

Manifest V3
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],
});

在背景服務 worker 中。

Chrome 擴充功能範例存放區內含函式插入範例,您可逐步執行相關步驟。getCurrentTab() 的範例可參考該函式的參照

尋找其他解決方法

如果上述方法無法解決您的用途,您可能必須尋找其他解決方案 (例如遷移至其他程式庫),或尋找其他方式使用程式庫的功能。舉例來說,如果您使用 Google Analytics,可以改用 Google 成效評估通訊協定,而非使用官方遠端代管的 JavaScript 版本,詳情請參閱 Google Analytics 4 指南

更新內容安全政策

"content_security_policy" 並未從 manifest.json 檔案中移除,但現在已成為支援兩個屬性的字典:"extension_pages""sandbox"

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "content_security_policy": {
    "extension_pages": "default-src 'self'",
    "sandbox": "..."
  }
  ...
}

extension_pages:指擴充功能中的背景資訊,包括 HTML 檔案和 Service Worker。

sandbox:參照擴充功能使用的任何採用沙箱機制的擴充功能頁面

移除不支援的內容安全性政策

Manifest V3 不允許在「"extension_pages"」欄位中使用 Manifest V2 允許的特定內容安全性政策值。具體來說,Manifest V3 不允許允許遠端程式碼執行的應用程式。script-src, object-srcworker-src 指令只能使用下列值:

  • self
  • none
  • wasm-unsafe-eval
  • 僅限未封裝的擴充功能:任何 localhost 來源,(http://localhosthttp://127.0.0.1 或這些網域上的任何通訊埠)

sandbox 的內容安全性政策值沒有這類新限制。