Политика функций: Использование политики функций
Использование политики функций
Политика функций позволяет контролировать, какие источники могут использовать какие функции, как в главном документе, так и во вложенных фреймах. По сути, вы задаёте политику, представляющую собой список разрешённых источников для каждой функции. Для каждой функции, контролируемой политикой функций, функция включена только в текущем документе или фрейме, если его источник соответствует разрешённому списку источников.
Для каждой контролируемой политикой функции браузер поддерживает список источников, для которых функция включена, известный как список разрешённых источников. Если вы не указываете политику для функции, используется список разрешённых источников по умолчанию. Список разрешённых источников по умолчанию специфичен для каждой функции.
Примечание: Заголовок Feature-Policy был переименован в Permissions-Policy в спецификации, и эта статья в конечном итоге будет обновлена, чтобы отразить это изменение.
Настройка политики
Политика описывается набором отдельных директив политики. Директива политики — это сочетание определённого имени функции и списка разрешённых источников, которые могут использовать эту функцию. Функции в рамках политики разделяются точкой с запятой.
Список разрешённых источников
Список разрешённых источников — это список источников, принимающий одно или несколько из следующих значений, разделённых пробелами:
-
*: Функция будет разрешена в этом документе и во всех вложенных контекстах просмотра (iframes) независимо от их источника. -
'self': Функция будет разрешена в этом документе и во всех вложенных контекстах просмотра (iframes) в том же источнике. -
'src': (Только в атрибуте iframeallow): Функция будет разрешена в этом iframe, при условии, что документ, загруженный в него, поступает из того же источника, что и URL в атрибуте src iframe.Примечание: Источник
'src'используется только в атрибуте iframeallowи является по умолчаниюallowlistзначением. -
'none': Функция отключена в верхнем и вложенных контекстах просмотра. - <источник(ы)>: Функция разрешена для определённых источников (например,
https://example.com). Источники должны быть разделены пробелом.
Значения * (включить для всех источников) или 'none' (отключить для всех источников) могут использоваться только по отдельности, а 'self' и 'src' могут использоваться с одним или несколькими источниками.
Каждая функция имеет собственный список разрешённых источников по умолчанию, который может быть:
-
*: Функция по умолчанию разрешена в верхних контекстах просмотра и во всех вложенных контекстах просмотра (iframes). -
'self': Функция по умолчанию разрешена в верхних контекстах просмотра и во вложенных контекстах просмотра (iframes) в том же источнике. Функция не разрешена в документах из других источников во вложенных контекстах просмотра. -
'none': Функция отключена в верхних и вложенных контекстах просмотра.
Указание вашей политики
Политика функций предоставляет два способа указания политик для управления функциями:
- Заголовок HTTP
Feature-Policy. - Атрибут
allowу элементов<iframe>.
Основное различие между заголовком HTTP и атрибутом allow заключается в том, что атрибут allow контролирует только функции внутри iframe. Заголовок контролирует функции в ответе и любом встроенном содержимом на странице.
Заголовок HTTP Feature-Policy
Вы можете отправить заголовок HTTP Feature-Policy вместе с ответом на страницу. Значение этого заголовка — политика, которая должна применяться браузером для данной страницы. Она имеет следующий формат.
Feature-Policy: <feature name> <allowlist of origin(s)>
Например, чтобы заблокировать использование API геолокации всем контентом на вашем сайте:
Feature-Policy: geolocation 'none'
Несколько функций могут контролироваться одновременно, отправляя заголовок HTTP со списком директив политики, разделённых точкой с запятой, или отправляя отдельный заголовок для каждой политики.
Например, следующее эквивалентно:
Feature-Policy: unsized-media 'none'; geolocation 'self' https://example.com; camera *; Feature-Policy: unsized-media 'none' Feature-Policy: geolocation 'self' https://example.com Feature-Policy: camera *;
Атрибут iframe allow
Второй способ использования политики функций — контроль содержимого внутри iframe. Используйте атрибут allow для указания списка политики для встроенного содержимого.
Например, разрешить всем контекстам просмотра внутри этого iframe использовать полноэкранный режим:
<iframe src="https://example.com/…" allow="fullscreen"></iframe>
Значение списка разрешённых источников по умолчанию <iframe> allowlist — 'src', поэтому это эквивалентно:
<iframe src="https://example.com/…" allow="fullscreen 'src'"></iframe>
Этот пример позволяет <iframe> контенту из определенного источника получать доступ к местоположению пользователя:
<iframe src="https://google-developers.appspot.com/demos/…" allow="geolocation https://google-developers.appspot.com"></iframe>
Так же, как и с заголовком HTTP, несколько функций могут контролироваться одновременно путём указания списка директив политики, разделённых точкой с запятой.
Например, это блокирует <iframe> от использования камеры и микрофона:
<iframe allow="camera 'none'; microphone 'none'">…</iframe>
Наследование политики для встроенного содержимого
Скрипты наследуют политику своего контекста просмотра, независимо от их источника. Это означает, что верхние скрипты наследуют политику из основного документа.
Все iframes наследуют политику своей родительской страницы. Если у iframe есть атрибут allow, политики родительской страницы и атрибута allow объединяются, используя наиболее ограниченный подмножество. Чтобы функция была включена в iframe, источник должен быть в списке разрешённых источников как для родительской страницы, так и для атрибута allow.
Отключение функции в политике — однонаправленная операция. Если функция отключена для дочернего фрейма родительским фреймом, дочерний фрейм не может её снова включить, и ни один из дочерних потомков тоже.
Принудительное применение лучших практик для улучшения пользовательского опыта
Сложно создать веб-сайт, который использует все современные лучшие практики, обеспечивает высокую производительность и отличный пользовательский опыт. По мере развития веб-сайта поддерживать пользовательский опыт со временем становится ещё сложнее. Вы можете использовать политику функций для указания желаемых лучших практик и полагаться на браузер для принудительного применения политик, чтобы предотвратить регрессии.
Существует несколько контролируемых политикой функций, предназначенных для представления функциональности, которая может негативно повлиять на пользовательский опыт. К этим функциям относятся:
- Анимации, вызывающие изменения макета
- Изображения без оптимизации (плохо сжатые)
- Изображения больших размеров
- Синхронные скрипты
- Синхронный XMLHttpRequest
- Мультимедиа без размера
Чтобы избежать разрыва существующего веб-контента, значение по умолчанию для таких контролируемых функциями политик — разрешить использование функциональности всеми источниками. То есть, список разрешённых источников по умолчанию — '*' для каждой функции. Чтобы предотвратить использование неэффективной функциональности, необходимо явно указать политику, отключающую эти функции.
Для нового контента вы можете начать разработку с политикой, отключающей все функции. Этот подход гарантирует, что ни одна из функциональностей не будет использоваться. При применении политики к существующему контенту, скорее всего, потребуется тестирование, чтобы проверить, продолжает ли он работать так, как ожидается. Это особенно важно для встроенного или стороннего контента, которым вы не управляете.
Чтобы включить принудительное применение всех лучших практик, укажите политику, как показано ниже.
Отправьте следующий заголовок HTTP:
Feature-Policy: layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';
Используя атрибут <iframe>:
<iframe src="https://example.com/…" allow="layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';"></iframe>
См. также
- Политика функций
-
Feature-Policyзаголовок - атрибут allow для iframe
-
Content-Security-Policyзаголовок -
Referrer-Policyзаголовок - Конфиденциальность, разрешения и безопасность информации
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Feature_Policy/Using_Feature_Policy