如果扩展程序会损害用户隐私或请求的权限似乎超出其所需范围,用户就不会安装该扩展程序。权限请求对用户而言必须合理,并且仅限于实现扩展程序所需的重要信息。如果扩展程序会收集或传输任何用户数据,则必须遵守保护用户隐私下的政策。
请采取以下预防措施来保护扩展程序用户并尊重其隐私,确保其身份安全。
减少所需权限
扩展程序可访问的 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/" ],
...
}
包含可选权限可让扩展程序在用户启用相关功能时说明为何需要特定权限。扩展程序可以为用户提供启用功能的选项。

点击好的!将触发 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 保存数据,也可以通过发出导致数据保存的服务器请求来保存数据。当扩展程序需要保存某些内容时,首先要考虑这些内容是否来自无痕式浏览窗口。默认情况下,扩展程序不会在无痕式窗口中运行。
无痕模式承诺窗口不会留下任何痕迹。在处理来自无痕窗口的数据时,扩展程序应遵守此承诺。如果扩展程序通常会保存浏览记录,则不保存无痕式窗口中的浏览记录。不过,扩展程序可以存储来自任何窗口(包括无痕式窗口)的设置偏好设置。
如需检测窗口是否处于无痕模式,请检查相关 tabs.Tab 或 windows.Window 对象的 incognito 属性。
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}