Объявляйте разрешения и предупреждайте пользователей

Возможность расширения получать доступ к веб-сайтам и большинству API-интерфейсов Chrome определяется его заявленными разрешениями . Разрешения должны быть ограничены только тем, что необходимо для его функциональности. Ограничение разрешений устанавливает возможности расширения и снижает возможное вторжение в данные, если расширение будет скомпрометировано злоумышленником. Защитите расширения и их пользователей, реализовав явные, минимальные и необязательные разрешения.

Организуйте разрешения

Разрешения — это известные строки, которые ссылаются на API Chrome или соответствуют шаблонам , предоставляющим доступ к одному или нескольким хостам. Они перечислены в манифесте и указаны как обязательные разрешения или дополнительные разрешения .

{
  "name": "Permissions Extension",
  ...
  // required permissions
  "permissions": [
    "activeTab",
    "contextMenus",
    "storage"
  ],
  // optional permissions
  "optional_permissions": [
    "topSites",
    "http://www.developer.chrome.com/*"
  ],
      ...
  "manifest_version": 2
}

Ограничьте необходимые разрешения только тем, что необходимо для основных функций расширения. Расширение не должно запрашивать больше разрешений, чем ему необходимо в данный момент; не рассчитывайте на будущее, запрашивая разрешения, которые могут потребоваться при обновлениях.

Разрешения, необходимые для дополнительных функций, должны быть зарегистрированы как дополнительные разрешения . Это позволяет пользователям решать, какой объем доступа они готовы предоставить расширению и какие функции им желательны.

Определите необходимые разрешения

Простому расширению может потребоваться запросить несколько разрешений, и при установке многих разрешений отображаются предупреждения . Пользователи с большей вероятностью будут доверять расширению с ограниченным количеством предупреждений или разъяснением разрешений.

Предупреждения о разрешении расширения при установке

Определите основные функции расширения и какие разрешения для него необходимы. Рассмотрите возможность сделать функции необязательными, если они требуют разрешений с предупреждениями.

Запуск дополнительных разрешений с помощью событий

Основная функциональность образца дополнительного расширения разрешений переопределяет страницу новой вкладки. Одна из функций — отображение цели пользователя на день. Для этой функции требуется только разрешение на хранение , которое не включает предупреждение.

Кнопка расширения, которая включает дополнительные функции

Расширение имеет дополнительную функцию; отображение топ-сайтов пользователя. Для этой функции требуется разрешение topSites , о котором имеется предупреждение.

Предупреждение о расширении для API topSites

Разработка функций, основанных на разрешениях с предупреждениями как необязательных, и органическое внедрение этих функций дает пользователям возможность без риска познакомиться с расширением. Кроме того, это позволяет пользователям дополнительно настраивать работу с расширением и дает возможность объяснять предупреждения.

Замените разрешение activeTab

Разрешение activeTab предоставляет временный доступ к сайту, на котором находится пользователь, и позволяет расширению использовать разрешение "tabs" на текущей вкладке. Во многих случаях он заменяет необходимость в "<all_urls>" и не отображает никаких предупреждений при установке.

Без ActiveTab:

Пользовательский интерфейс разрешений без activeTab

С активным табом:

Пользовательский интерфейс разрешений с ActiveTab

Разрешение activeTab предоставляет расширению временный доступ к текущей активной вкладке, когда пользователь вызывает расширение. Если расширение скомпрометировано, злоумышленнику придется дождаться, пока пользователь вызовет расширение, прежде чем получить доступ, и этот доступ будет длиться только до тех пор, пока вкладка не будет перемещена или закрыта.

Хотя для вкладки включено разрешение activeTab , расширение может:

  • Вызовите tabs.executeScript или tabs.insertCSS на этой вкладке.
  • Получите URL-адрес, заголовок и значок этой вкладки через API, который возвращает объект tabs.Tab .
  • Перехватывайте сетевые запросы на вкладке к источнику основного кадра вкладки с помощью API webRequest . Расширение временно получает разрешения хоста для источника основного фрейма вкладки.

Следующие пользовательские жесты включают activeTab :

Разрешение доступа

Если расширению необходимо получить доступ к URL-адресам file:// или работать в режиме инкогнито, пользователям необходимо будет разрешить доступ к этим функциям на странице сведений о расширении по адресу chrome://extensions.

Разрешить URL-адреса файлов и режим инкогнито на странице сведений о расширении.

Расширение может определить, включено ли оно в режиме инкогнито, вызвав extension.isAllowedIncognitoAccess() или способно запускаться по URL-адресам file:// с extension.isAllowedFileSchemeAccess() .

Понимание разрешений

Предупреждения о разрешениях существуют для описания возможностей, предоставляемых API пользователям расширений, но некоторые из этих предупреждений поначалу могут быть неочевидны. Например, добавление разрешения "tabs" приводит к появлению, казалось бы, несвязанного предупреждения: расширение может читать вашу активность в Интернете . Хотя API chrome.tabs можно использовать только для открытия новых вкладок, его также можно использовать для просмотра URL-адреса, связанного с каждой вновь открытой вкладкой, с помощью их объектов tabs.Tab .

По возможности реализуйте дополнительные разрешения или менее мощный API, чтобы избежать тревожных предупреждений.

Просмотр предупреждений

Предупреждения о разрешениях не будут отображаться, если расширение загружается как распакованный файл. Чтобы просмотреть предупреждения о разрешениях расширения, перейдите по адресу chrome://extensions , убедитесь, что режим разработчика включен, и нажмите PACK EXTENSION .

Режим разработчика установлен, затем нажмите «Расширение пакета».

Укажите путь к папке расширения в поле «Корневой каталог расширения», затем нажмите кнопку «Упаковать расширение» . Игнорируйте поле «Частный ключ» для первого пакета.

Укажите путь расширения, затем нажмите «Упаковать расширение».

Chrome создаст два файла: файл .crx и файл .pem , содержащий закрытый ключ расширения.

Упакованные файлы расширений

Не потеряйте приватный ключ! Храните файл .pem в секретном и безопасном месте; это будет необходимо для обновления расширения.

Установите файл .crx , перетащив его на страницу управления расширением Chrome.

Перетащите файл для установки

После удаления файла .crx браузер спросит, можно ли добавить расширение, и отобразит предупреждения.

Предупреждение о расширении новой вкладки

Разрешения с предупреждениями

Примечание. Таблицы разрешений обновляются по мере возможности и могут содержать небольшие расхождения с текущими предупреждениями. Кроме того, некоторые разрешения могут не отображать предупреждения в сочетании с другими разрешениями. Например, предупреждение "tabs" не будет отображаться, если расширение также запрашивает "<all_urls>" . Чтобы проверить последние предупреждения, отображаемые для разрешений расширения, выполните действия, описанные в разделе «Просмотр предупреждений» .

Разрешение Описание Предупреждение
  • "http://*/*"
  • "https://*/*"
  • "*://*/*"
  • "<all_urls>"
Предоставляет расширению доступ ко всем хостам. Возможно, можно избежать объявления каких-либо разрешений хоста, используя разрешение activeTab . Прочитайте и измените все свои данные на веб-сайтах, которые вы посещаете.
"https://HostName.com/" Предоставляет расширению доступ к "https://HostName.com/" . Возможно, можно избежать объявления каких-либо разрешений хоста, используя разрешение activeTab . Прочитайте и измените свои данные на HostName.com
"bookmarks" Предоставляет вашему расширению доступ к API chrome.bookmarks . Читайте и меняйте закладки
"clipboardRead" Требуется, если расширение использует document.execCommand('paste') . Чтение данных, которые вы копируете и вставляете
"clipboardWrite" Указывает, что расширение использует document.execCommand('copy') или document.execCommand('cut') . Измените данные, которые вы копируете и вставляете
"contentSettings" Предоставляет вашему расширению доступ к API chrome.contentSettings . Измените настройки, которые контролируют доступ веб-сайтов к таким функциям, как файлы cookie, JavaScript, плагины, геолокация, микрофон, камера и т. д.
"debugger" Предоставляет вашему расширению доступ к API chrome.debugger .
  • Доступ к серверной части отладчика страниц
  • Прочитайте и измените все свои данные на веб-сайтах, которые вы посещаете.
"declarativeNetRequest" Предоставляет вашему расширению доступ к API chrome.declarativeNetRequest . Заблокировать содержимое страницы
"desktopCapture" Предоставляет вашему расширению доступ к API chrome.desktopCapture . Захват содержимого вашего экрана
"downloads" Предоставляет вашему расширению доступ к API chrome.downloads . Управляйте своими загрузками
"geolocation" Позволяет расширению использовать API геолокации HTML5 без запроса разрешения у пользователя. Определите свое физическое местоположение
"history" Предоставляет вашему расширению доступ к API chrome.history . Чтение и изменение истории просмотров
"management" Предоставляет расширению доступ к API chrome.management . Управляйте своими приложениями, расширениями и темами
"nativeMessaging" Предоставляет расширению доступ к собственному API обмена сообщениями . Общайтесь с сотрудничающими собственными приложениями
"notifications" Предоставляет вашему расширению доступ к API chrome.notifications . Отображать уведомления
"pageCapture" Предоставляет расширению доступ к API chrome.pageCapture . Прочитайте и измените все свои данные на веб-сайтах, которые вы посещаете.
"privacy" Предоставляет расширению доступ к API chrome.privacy . Измените настройки конфиденциальности
"proxy" Предоставляет расширению доступ к API chrome.proxy . Прочитайте и измените все свои данные на веб-сайтах, которые вы посещаете.
"system.storage" Предоставляет расширению доступ к API chrome.system.storage . Определить и извлечь устройства хранения данных
"tabCapture" Предоставляет расширениям доступ к API chrome.tabCapture . Прочитайте и измените все свои данные на веб-сайтах, которые вы посещаете.
"tabs" Предоставляет расширению доступ к привилегированным полям объектов Tab , используемых несколькими API, включая chrome.tabs и chrome.windows . Во многих случаях расширению не нужно будет объявлять разрешение "tabs" для использования этих API. Прочитайте историю посещений
"topSites" Предоставляет расширению доступ к API chrome.topSites . Прочитайте список наиболее часто посещаемых вами веб-сайтов.
"ttsEngine" Предоставляет расширению доступ к API chrome.ttsEngine . Прочитайте весь произнесенный текст, используя синтезированную речь.
"webNavigation" Предоставляет расширению доступ к API chrome.webNavigation . Прочитайте историю посещений

Обновить разрешения

Обновление расширения с дополнительными разрешениями может временно отключить его. Пользователю придется повторно включить его после согласия со всеми новыми предупреждениями.

Если пользователь вручную обновит расширение, которое теперь включает разрешение вкладок , он получит предупреждение на странице управления.

Добавление вкладок Разрешение

Если расширение обновляется автоматически, оно будет отключено до тех пор, пока пользователь не согласится с новыми разрешениями.

Расширение отключено

Согласен с разрешениями

Этого можно избежать, сделав новую функцию необязательной и добавив новые обновления разрешений для optional_permissions в манифесте .