“activeTab”权限

"activeTab" 权限可让扩展程序在用户调用扩展程序(例如点击其操作)时临时访问当前处于活动状态的标签页。用户在相应页面上时,可以访问该标签页;当用户离开或关闭该标签页时,访问权限会被撤消。 例如,如果用户在 https://example.com 上调用扩展程序,然后导航到 https://example.com/foo,则该扩展程序将继续有权访问该网页。如果用户转到 https://chromium.org,访问权限会被撤消。

这可作为 "<all_urls>" 的替代选项,但在安装期间不会显示警告消息:

未设置"activeTab":

不使用 activeTab

使用 "activeTab" 进行更新:

使用 activeTab

无法访问受限页面,例如 chrome:// 页面。

示例

请参阅 Page Redder 示例扩展程序:

manifest.json:

{
  "name": "Page Redder",
  "version": "2.0",
  "permissions": [
    "activeTab",
    "scripting"
  ],
  "background": {
    "service_worker": "service-worker.js"
  },
  "action": {
    "default_title": "Make this page red"
  },
  "manifest_version": 3
}

service-worker:

function reddenPage() {
  document.body.style.backgroundColor = 'red';
}

browser.action.onClicked.addListener((tab) => {
  // If the tab URL is not set, it is a restricted page.
  if (tab.url) {
    browser.scripting.executeScript({
      target: { tabId: tab.id },
      func: reddenPage
    });
  }
});

动机

假设有一个具有操作和上下文菜单项的网页剪辑扩展程序。此扩展程序可能只需要在用户点击其操作或执行其上下文菜单项时访问标签页。

如果没有 "activeTab",此扩展程序就需要请求对每个网站的完整、永久访问权限,以便在用户恰好调用它时能够正常工作。对于如此简单的扩展程序,这已经是非常强大的功能了。如果扩展程序遭到入侵,攻击者将获得该扩展程序拥有的所有权限。

相比之下,具有 "activeTab" 权限的扩展程序只有在响应明确的用户手势时才能获得对标签页的访问权限。如果扩展程序遭到入侵,攻击者需要等待用户调用该扩展程序,然后才能获得访问权限。并且该访问权限仅在标签页被导航或关闭之前有效。

“activeTab”允许的操作

当某个标签页启用了 "activeTab" 权限时,扩展程序可以:

  • 如果还声明了 "scripting" 权限(如上例所示),请在该标签页上调用 scripting.insertCSS() 或 scripting.executeScript()。
  • 通过返回 tabs.Tab 对象的 API 获取该标签页的网址、标题和网站图标(实质上,"activeTab" 会临时授予主机权限)。
  • 使用 webRequest API 拦截标签页中发往标签页主框架来源的网络请求。扩展程序会暂时获得标签页主框架源的主机权限。

调用 activeTab

以下用户手势可启用 "activeTab" 权限: