如果擴充功能危及隱私,或要求額外權限,使用者就無法安裝擴充功能。對使用者的權限要求必須合理,且僅限於執行擴充功能所需的重要資訊。如果擴充功能會收集或傳輸任何使用者資料,就必須遵循「保護使用者隱私權」下的政策。
加入這些預防措施來保護及尊重擴充功能使用者的身分,藉此保護及尊重擴充功能使用者。
減少必要權限
擴充功能可存取的 API 會在資訊清單的 permissions
欄位中指定。授予的權限越多,攻擊者就越有可能攔截資訊。系統只會列出擴充功能依附的 API,並考量較少侵略性的選項。因擴充功能要求的權限越少,向使用者顯示的權限警告就越少。使用者較有可能安裝顯示有限警告的擴充功能。
擴充功能不得以要求「未來」的方式存取使用者資料,也就是要求他們目前不需要的權限,但日後可能會實作的權限。透過擴充功能更新加入新權限,並視需要選用。
activeTab
使用主機權限插入指令碼的擴充功能通常可替換 activeTab
。activeTab
權限只會在使用者叫用擴充功能時授予擴充功能暫時存取目前使用中分頁的權限。使用者離開或關閉目前的分頁時,存取權會遭到截斷。可做為 <all_urls>
的替代使用。
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": ["activeTab"],
"manifest_version": 3
}
ActiveTab 權限在安裝期間不會顯示警告訊息。
選擇授予選用權限
讓使用者能夠透過加入選用權限,選擇擴充功能所需的功能和權限。如果某項功能對擴充功能的核心功能並不重要,請選用該功能,並將該 API 或網域移至 optional_permissions
欄位。
{
"name": "Very Secure Extension",
...
"optional_permissions": [ "tabs", ],
"optional_host_permissions": ["https://www.google.com/" ],
...
}
加入選用權限可讓擴充功能說明使用者在啟用相關功能時,為何需要特定權限。該擴充功能可提供使用者啟用功能的選項。
按一下「Okay!」,即可在服務 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,或透過產生伺服器要求來儲存資料,藉此儲存資料。當擴充功能需要儲存內容時,請先考慮是否來自無痕式視窗。根據預設,擴充功能不會在無痕式視窗中執行。
無痕模式會保證視窗不會留下任何軌跡。處理無痕式視窗中的資料時,擴充功能應遵循這個承諾。如果擴充功能通常會儲存瀏覽記錄,則不要儲存無痕式視窗的記錄。不過,擴充功能可以從任何視窗 (無論是否為無痕模式) 儲存偏好設定。
如要偵測視窗是否處於無痕模式,請查看相關 tabs.Tab
或 windows.Window
物件的 incognito
屬性。
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}