如果擴充功能會侵害使用者隱私,或要求取得應用程式所需的其他權限,使用者就不會安裝該擴充功能。對使用者的權限要求必須合理,且僅限於執行擴充功能所需的重要資訊。如果擴充功能會收集或傳送任何使用者資料,就必須遵循「保護使用者隱私權」一節中的政策。
納入這些預防措施來保護擴充功能使用者的身分,保護並尊重他們的安全。
減少必要權限
系統會在資訊清單的 permissions
欄位中指定擴充功能可存取的 API。授予的權限越多,攻擊者就越需要攔截資訊。系統只會列出擴充功能所依附的 API,並考慮放寬安全性選項。擴充功能要求的權限越少,系統向使用者顯示的權限警告就會越少。使用者較有可能安裝含有有限警告的擴充功能。
擴充功能不得「確保未來一致」存取使用者資料,藉此要求他們目前不需要的權限,但未來或許可以導入。更新擴充功能時納入新權限,建議視需要設定更新權限。
activeTab
使用主機權限插入指令碼的擴充功能通常可以改用 activeTab
。activeTab
權限只會在使用者叫用擴充功能時,將暫時存取權授予目前使用中的分頁。當使用者離開或關閉目前的分頁時,存取權就會失效。這可做為許多 <all_urls>
用途的替代方法。
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": ["activeTab"],
"manifest_version": 3
}
使用中分頁權限時,系統不會在安裝期間顯示警告訊息。
選擇選用權限
可以加入選擇性權限,讓使用者自行選擇擴充功能所需的功能和權限。如果某項功能對擴充功能核心功能來說無關緊要,請設為選用,並將該 API 或網域移至 optional_permissions
欄位。
{
"name": "Very Secure Extension",
...
"optional_permissions": [ "tabs", ],
"optional_host_permissions": ["https://www.google.com/" ],
...
}
加入選用權限可讓擴充功能說明為何需要特定權限 使用者啟用相關功能時。這項擴充功能可讓使用者選擇啟用 接著介紹網際網路通訊層 包括兩項主要的安全防護功能
按一下「Okay!」,會在 Service Worker 中觸發下列事件。
chrome.action.onClicked.addListener((event) => {
// Permissions must be requested from inside a user gesture, like a button's
// click handler.
chrome.permissions.request(
{
permissions: ["tabs", "scripting"],
origins: ['https://www.google.com/']
},
function (granted) {
// The callback argument will be true if the user granted the permissions.
if (granted) {
// doSomething();
} else {
// doSomethingElse();
}
}
);
});
使用者隨後會收到下列要求的提示。
您也可以在更新擴充功能時實作選用權限。如此一來,新的 功能,因為如果更新 授予必要權限。
限制及保護使用者資訊
只要求擴充功能所需的最低資料量。如果使用者詢問擴充功能的資訊越少,代表該擴充功能遭駭時也會減少曝光。
請謹慎處理所有要求的使用者資料。使用以下應用程式儲存和擷取資料 或是已註冊的網域。一律使用 HTTPS 連線,並避免將機密資料保留在用戶端中 這是因為擴充功能儲存空間未加密。
儲存資料和無痕模式
擴充功能可以使用 storage API 儲存資料,或是提出伺服器要求 最終會儲存資料需要儲存擴充功能時,請先考慮擴充功能是否來自 無痕式視窗根據預設,擴充功能不會在無痕式視窗中執行,
無痕模式會承諾視窗不會留下任何追蹤。處理來自以下來源的資料時 無痕式視窗,擴充功能應遵循這項承諾如果擴充功能在一般情況下會儲存瀏覽紀錄 時一律不儲存無痕式視窗的記錄。但擴充功能可以儲存設定 由任何視窗、無痕模式或無痕模式接收的偏好設定
如要偵測視窗是否處於無痕模式,請查看相關項目的 incognito
屬性
tabs.Tab
或 windows.Window
物件。
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}