如果扩展程序侵犯了用户隐私或会要求用户提供似乎需要的更多权限,则用户不会安装该扩展程序。对用户的权限请求必须合理,且仅限于实施扩展程序所需的关键信息。收集或传输任何用户数据的扩展程序都必须遵守保护用户隐私下的政策。
通过添加这些预防措施来确保用户的身份安全,从而保护并尊重扩展程序用户。
减少所需权限
扩展程序可以访问的 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! 将在 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 来保存数据,或发出可保存数据的服务器请求。当扩展程序需要保存内容时,请先考虑该内容是否来自无痕式窗口。默认情况下,扩展程序不会在无痕式窗口中运行。
无痕模式承诺在该窗口中不会留下任何痕迹。在处理来自无痕式窗口的数据时,扩展程序应遵守此 promise。如果扩展程序通常会保存浏览记录,请勿在无痕式窗口中保存历史记录。不过,无论在无痕式窗口中,扩展程序都可以存储来自任何窗口的设置偏好设置。
如需检测窗口是否处于无痕模式,请检查相关 tabs.Tab
或 windows.Window
对象的 incognito
属性。
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}