--- title: Using Feature Policy slug: Web/HTTP/Feature_Policy/Using_Feature_Policy translation_of: Web/HTTP/Feature_Policy/Using_Feature_Policy ---
Функциональная политика позволяет разработчику контролировать доступ страницам сайта к определённой веб функциональности браузера, как страницам высокого уровня, так и встроенным в страницу фреймам. По сути, разработчик определяет политику, которая позволяет использовать определённую функциональность списку разрешённых источников. Каждая функция, контролируемая функциональной политикой, активируется в определённом документе или фрейме, если его источник происхождения входит в разрешённый список источников.
Для каждой функции, контролируемой функциональной политикой, браузер отслеживает список источников происхождения, для документов которого, эта функция разрешена. Если разработчик не определил политику для функциональности, тогда будет использован список разрешённых источников по умолчанию. Этот список специфичен для каждой функциональности.
Политика определяется, используя набор индивидуальных установочных директив. Установочная директива - это комбинация имён определяемых функциональностей, со списком источников происхождения, которым разрешается доступ к указанной функциональности. Имена функциональностей в политике разделяются точкой с запятой.
Список доступа - это список источников происхождения, которые принимают одно или несколько следующих значений, разделяемых пробелом:
*
: Функциональность разрешается в документе и всем вложенным в документ браузерным контекстам (элементам iframes
) вне зависимости от источника их происхождения.'self'
: Функциональность разрешается в документе и всем вложенным в него браузерным контекстам (элементам iframes
) общего с этим документом источником происхождения.'src'
: (только для элемента iframe
с атрибутом allow
) Функциональность доступна в этом фрейме, при условии, что загруженный в него документ происходит из того же источника, что и URL в атрибуте {{HTMLElement('iframe','src','#Attributes')}} элемента iframe
.'none'
: Функциональность отключена как для высокоуровневых документов, так и для вложенных в него контекстов (iframes
).Значение *
(доступность функциональности для всех источников) или 'none'
(не доступность функциональности для всех источников), может использоваться только однократно, в то время как, значения 'self'
и 'src'
могут быть использованы с одним или несколькими источниками происхождения.
Каждая функциональность определяется со своим списком разрешений по умолчанию, который содержит одно из значений:
*
: Функциональность доступна по умолчанию для высокоуровневых документов и всех вложенных элементах iframes
.'self'
: Функциональность доступна по умолчанию в документах высокого уровня и во вложенных элементах iframes
, одного с документом источником происхождения. Функциональность не доступна в кросс-доменных документах элементов iframes.
'none'
: Функциональность по умолчанию отключена во всех браузерных контекстах.Функциональная политика предлагает два способа определения политик:
Основное отличие между заголовком HTTP и атрибутом allow
в том, что атрибут определяет доступность функциональности для документов, загруженных в iframe
. Заголовок же определяет доступность функциональности в документе и вложенных в него контекстах, направляющимся в ответе на HTTP(S) запрос.
Отправить заголовок функциональной политики можно в ответе на запрос документа (страницы). Значение заголовка переопределяет политику браузера по умолчанию для данной страницы. Он имеет следующую структуру.
Feature-Policy: <имя функциональности> <список разрешённых источников>
К примеру, для блокировки функциональности 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
.
К примеру, для разрешения использования функциональности fullscreen
для документа, загруженного в iframe
используем :
<iframe src="https://example.com..." allow="fullscreen"></iframe>
Эквивалентная запись:
<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'">
Контексты скриптов (.js) наследуют политику их браузерных контекстов, вне зависимости от их источника происхождения. Это значит, что скрипты документа высокого уровня наследуют политику основного документа..
Все фреймы наследуют политику своих родительских документов. Если фрейм имеет атрибут allow
, политики родительского документа и атрибута комбинируются, используя наиболее ограничительную политику. Для включения функциональности для фрейма, его источник происхождения должен входить в списки доступа и родительского документа, и атрибута allow
.
Отключение функциональности в политике является односторонним. Если функциональность не доступна (отключена) для дочернего фрейма его родителем, дочерний фрейм не может это отменить, и ни его потомки.
Трудно создать веб сайт, который использует новейшие решения и предлагает отличную производительность. Со временем, эволюционируя, сайту может даже труднее обеспечивать наилучшие пользовательские впечатления. Используйте функциональные политики для определения новейших решений, и полагайтесь на современные браузеры в предотвращении негативных изменений.
Существуют несколько функциональных политик, спроектированных для предоставления функциональности, но которые могут негативно влиять на впечатления пользователя. Ими являются:
Для исключения поломки веб контента, значения по умолчанию для таких функциональных политик, позволяют функциональности быть использованной для всех источников происхождения. То есть, списком разрешений по умолчанию является '*'
для каждой функциональности. Предотвращение использования неоптимальной функциональности, требует явного определения политики, которая отключает функциональности.
Для нового контента можно начать разработку с политикой, которая отключает все функциональности. Такой подход гарантирует, что ни одна из функциональностей не включена. При применении политики для существующего контента, тестирование работы наиболее желательный вариант для ожидаемой проверки работоспособности. Это особенно важно для встроенных или сторонних контентов, которых разработчик не может контролировать.
Для включения правоприменения всех новейших решений, определяется политика ниже.
Отправляйте следующий HTTP заголовок:
Feature-Policy: layout-animations 'none'; unoptimized-images 'none'; oversized-images 'none'; sync-script 'none'; sync-xhr 'none'; unsized-media 'none';
Используя атрибут allow
элемента <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>
iframe