Permissions-Policy
Применение
Заголовок ответа Permissions-Policy ограничивает, какие возможности браузера разрешены в текущем фрейме. Каждая политика связывает директиву возможности со списком разрешённых источников, определяющим, какие источники получают доступ к этой возможности.
Permissions-Policy: <directive>=<allowlist>
Примечание
Рекомендуемая начальная политика отключает возможности, которые сайт не использует: Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=(). Сканеры безопасности отмечают отсутствие заголовка Permissions-Policy. Настройка минимальной политики устраняет это замечание, не влияя на работу сайта.
Примечание
Механизм Permissions-Policy ранее был известен как Feature Policy.
Директивы
Имя директивы определяет возможность браузера, которой нужно управлять. Неполный список стандартизированных директив:
Примечание
Директива interest-cohort использовалась для блокировки Federated Learning of Cohorts (FLoC). Google отказался от FLoC в 2022 году и заменил этот API на Topics API. Директива interest-cohort удалена из реализаций браузеров.
Значения списка разрешённых источников
Параметр
Примечание
Директива unload блокирует обработчики события unload для источника. Установка Permissions-Policy: unload=() не даёт собственному коду сайта, сторонним скриптам и расширениям браузера регистрировать обработчики unload. Это существенно для производительности кэша навигации назад-вперёд (bfcache), поскольку обработчики unload не позволяют браузеру кэшировать страницы для мгновенного перехода назад и вперёд. Chrome постепенно полностью отказывается от событий unload, начиная с высоконагруженных сайтов и распространяя это на все сайты. Установка unload=() немедленно подключает сайт к этому отказу и гарантирует право на bfcache независимо от графика развёртывания.
Пример
В следующем примере сервер указывает, что возможность geolocation должна быть отключена во всех контекстах.
Permissions-Policy: geolocation=()
В следующем примере сервер указывает, что возможность encrypted-media должна быть отключена для всех источников, кроме report.example.re.
Permissions-Policy: encrypted-media=("https://report.example.re")
В следующем примере сервер указывает, что возможность microphone должна быть отключена для всех источников, кроме него самого и источников с origin example.re.
Permissions-Policy: microphone=(self "https://example.re")
Блокировка обработчиков unload для повышения шансов на попадание в bfcache. Это не даёт сторонним скриптам и расширениям регистрировать события unload, снижающие производительность навигации назад и вперёд.
Permissions-Policy: unload=()
Диагностика
Нарушения Permissions-Policy в большинстве случаев происходят незаметно: заблокированная возможность возвращает состояние отказа или выбрасывает ошибку без видимого запроса от браузера.
Возможность заблокирована в iframe из-за отсутствия атрибута allow. Даже если родительская страница разрешает возможность, встроенным iframe нужен явный атрибут allow для доступа к ней. Добавьте атрибут в тег iframe:
Geolocation, camera или microphone не работают после настройки политики. Политика вида Permissions-Policy: geolocation=() отключает возможность для всех источников, включая саму страницу. Чтобы разрешить возможность только для того же источника, используйте geolocation=(self). Чтобы дополнительно разрешить конкретный встроенный источник, используйте geolocation=(self “https://maps.example.re”). Браузер никогда не запрашивает у пользователя разрешение на возможность, которую политика уже запретила.
Подстановочный знак * работает не для всех возможностей. Некоторые возможности не поддерживают значение * в списке разрешённых источников и ограничены явными списками источников. Если * не даёт эффекта, укажите каждый разрешённый источник по отдельности. Проверьте консоль браузера на наличие предупреждений о нераспознанных или неподдерживаемых значениях списка.
Миграция с Feature-Policy на Permissions-Policy. Устаревший заголовок Feature-Policy использует другой синтаксис: Feature-Policy: geolocation ‘self’ против Permissions-Policy: geolocation=(self). Браузеры, поддерживающие Permissions-Policy, игнорируют Feature-Policy, когда присутствуют оба заголовка. Обновите имя заголовка и преобразуйте синтаксис: замените пробелы на =, заключите списки источников в круглые скобки и уберите одинарные кавычки вокруг self и none (используйте () вместо ‘none’).
Отладка с помощью document.featurePolicy.allowsFeature(). В браузерах на базе Chromium откройте консоль DevTools и выполните document.featurePolicy.allowsFeature(‘camera’), чтобы проверить, разрешена ли возможность в текущем контексте. Метод возвращает true или false. Для контекста iframe передайте источник вторым аргументом: document.featurePolicy.allowsFeature(‘camera’, ‘https://embed.example.re’). Firefox использует document.permissionsPolicy вместо document.featurePolicy.