Назад к блогу
Платформа

Политика разрешений для встроенных возможностей браузера

Практическое руководство по делегированию возможностей iframe и разграничению политик браузера.

BotBrowser Team

Документация

Нужна структурированная документация по теме Платформа?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Страница делегирует возможность встроенному фрейму и отдельно фиксирует политику, разрешение и результат

Политика разрешений ограничивает возможности браузера для документа. Ответ верхнего документа задаёт верхнюю границу, а атрибут allow у iframe делегирует конкретную возможность дочернему источнику. Это граница возможностей, а не выдача пользовательского разрешения, создание устройства или подтверждение бизнес-операции.

Для камеры, микрофона, геолокации и полноэкранного режима записывайте отдельно полученный заголовок, конечный origin, состояние разрешения и видимый результат. Такая модель показывает, на каком этапе возникла проблема, и не требует расширять доступ из-за сбоя одного поставщика. В примере сравниваются https://app.example и https://widget.example.

В примере сравниваются https://app.example и https://widget.example.

Что именно контролирует политика

Спецификация W3C связывает имя возможности со списком origin. Например, Permissions-Policy: geolocation=(self "https://widget.example") разрешает основной origin и названный виджет. iframe также должен соответствовать этому origin: allow="geolocation" не авторизует другой адрес. Проверяйте схему, порт, redirects и всю цепочку предков. Значения по умолчанию зависят от функции; сверяйтесь с MDN.

Результат allowed означает только право попытаться вызвать API. Нужны secure context, жест пользователя, пользовательское или администраторское решение, устройство и параметры функции. navigator.permissions может показывать prompt или granted, пока фрейм заблокирован политикой.

ЭтапДоказательствоЧто это не доказывает
Origin и контекстКонечный URL, схема, порт, secure contextНаличие API
РеализацияУзкая проверка интерфейсаУспешный вызов
Политика разрешенийЗаголовок, allow, предки, дочерний originРазрешение пользователя или устройство
Решение платформыprompt, отказ, настройка, состояние устройстваЗавершение операции
ПриложениеВидимый статус и подтверждение с таймаутомСерверную запись без серверных данных

camera, microphone, geolocation и fullscreen являются разными записями. Разрешайте только необходимое. Не используйте * в multi-tenant системе: проверяйте фактический origin после redirect и поддерживайте обозримый allowlist.

Граница с CSP, COOP и COEP

CSP определяет, какие скрипты, подключения, изображения и фреймы могут загружаться через script-src, connect-src и frame-src. CSP может остановить загрузку до проверки политики разрешений, а загруженный фрейм всё равно может быть заблокирован. Не ослабляйте CSP для исправления делегирования.

COOP меняет связи между окнами и верхнеуровневыми browsing contexts. COEP задаёт условия CORS или CORP для cross-origin ресурсов. Ни один заголовок не выдаёт камеру, микрофон или геолокацию; политика разрешений также не создаёт cross-origin isolation и не делает ресурс CORS-совместимым. Проверяйте сеть и CSP, затем origin и изоляцию, если они нужны, затем header и allow, и только после этого запускайте запрос, требующий жест пользователя.

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

Запрос проходит несколько этапов

Сначала проверьте конечный origin и безопасный контекст.

Затем проверьте наличие нужного интерфейса в браузере.

Запишите header, allow, цепочку предков и дочерний origin.

После политики ещё могут вмешаться жест, разрешение, администратор и устройство.

В конце проверьте статус, который видит пользователь.

Контракт встраивания и запасной путь

До изменения заголовка зафиксируйте верхний и конечный дочерний origin, функцию, цель, жест, владельцев header и markup, а также видимую альтернативу. Для камеры оставьте ручную загрузку, для полноэкранного режима используйте обычную навигацию, для геолокации разрешите ручной ввод. Отказ и timeout не должны терять фокус и данные. По завершении остановите tracks и не повторяйте prompt незаметно.

Собственный control/candidate fixture

Разместите /fixtures/permissions-policy/control.html и candidate.html на собственном хосте. Страницы используют один и тот же frame, кнопку и маркер статуса; только candidate получает заголовок делегирования, а control его не получает. Скрипт ребёнка после явного клика выводит policy=blocked или policy=allowed. Разрешение должно быть синтетическим; настоящие координаты не собирайте.

import { test, expect } from '@playwright/test';

const cases = [
  { name: 'control', url: 'https://qa.example.test/fixtures/permissions-policy/control.html', expected: 'blocked' },
  { name: 'candidate', url: 'https://qa.example.test/fixtures/permissions-policy/candidate.html', expected: 'allowed' },
];

for (const scenario of cases) {
  test(`Permissions Policy ${scenario.name}`, async ({ page }) => {
    try {
      const response = await page.goto(scenario.url, { waitUntil: 'domcontentloaded', timeout: 8000 });
      expect(response?.ok(), `HTTP-ответ ${scenario.name}`).toBeTruthy();
    } catch (error) {
      throw new Error(`NETWORK_ERROR до проверки политики: ${error.message}`);
    }
    await page.getByRole('button', { name: 'Request location' }).click();
    await expect(page.getByTestId('policy-result')).toHaveText(new RegExp(`^${scenario.expected}$`), { timeout: 5000 });
  });
}

Timeout навигации или статуса означает отсутствие доказательства в заданное время, а не policy denial. DNS, сертификат, HTTP-ошибка и отсутствующий маршрут должны оставаться NETWORK_ERROR, а не превращаться в blocked. Закройте context и удалите временные данные в teardown, сохранив первую ошибку. Атрибуция обеспечивается одинаковыми origin, frame, кнопкой и маркером: меняется только делегирование.

Развёртывание и диагностика

На стенде используйте рабочую маршрутизацию и origins. После redirect, CDN, фонового сетевого обработчика и proxy проверьте фактический header и конечный allow. Классифицируйте первое событие: неверный header, это конфигурация; загруженный frame со blocked, это цепочка политики; allowed и отказ, это разрешение или состояние браузера; ошибка после API, это приложение; timeout или DNS, это доступность.

Проверьте удаление функции, неожиданный origin, redirect на неразрешённый origin и вложенный frame без делегирования. Храните прежние header, markup и версию для rollback. Не лечите сбой удалением всего заголовка или добавлением *; временное исключение должно назвать функцию, origin, владельца и срок.

Что может проверить BotBrowser

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

BotBrowser не создаёт и не разворачивает заголовки, не меняет origins, не выдаёт разрешения, не предоставляет устройства, не заменяет CSP/COOP/COEP, не исправляет ответ поставщика и не доказывает удалённую бизнес-операцию. Авторитетны спецификация W3C и фактически доставленные заголовки. За дизайн политики отвечают владельцы приложения, инфраструктуры, поставщика и согласия.

Не записывайте cookies, учётные данные, координаты или содержимое потоков.

Для каждой попытки используйте отдельную синтетическую учётную запись.

После смены поставщика заново проверьте конечный origin.

У временного исключения должны быть владелец и срок окончания.

Откат должен вернуть header и markup вместе.

В поддержку передавайте первую не пройденную дверь, а не общую метку ошибки.

См. руководство по безопасным контекстам.

См. руководство CSP.

См. руководство изоляции между origin.

Согласие должно объяснять цель до жеста пользователя.

Источники

BotBrowser Team

#Permissions Policy#Iframe#Безопасность Браузера#Веб-Платформа

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.