Permissions-Policy (раніше Feature-Policy) дозволяє сайту заборонити чи обмежити доступ до потужних можливостей браузера - для власних сторінок і для вбудованих фреймів.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(self), fullscreen=(self "https://player.example")
()- вимкнено для всіх, включно з самим сайтом;(self)- лише для власного походження;(self "https://...")- для себе й переліченого походження;*- для всіх (рідко потрібно).
Що можна контролювати: камера, мікрофон, геолокація, повноекранний режим, платежі (Payment Request), USB, Bluetooth, MIDI, автовідтворення, датчики, буфер обміну, демонстрація екрана тощо.
Навіщо, якщо браузер і так запитує дозвіл у користувача:
- принцип найменших можливостей: якщо сайт ніколи не використовує камеру, то навіть після XSS шкідливий скрипт не зможе попросити доступ до неї від імені вашого домену - запит буде заблоковано без діалогу;
- вбудовані фрейми: реклама, віджети, сторонні сервіси у
<iframe>не отримають доступу до можливостей, які ви не делегували; - захист довіри до домену: діалог «example.com хоче використовувати камеру» - від вашого імені. Сторонній код у фреймі не повинен мати змоги його викликати.
Делегування фрейму - атрибутом allow:
<iframe src="https://video.example/embed/42" allow="fullscreen; autoplay"></iframe>
Фрейм отримає лише ті можливості, які дозволено і заголовком сторінки, і атрибутом allow.
Практичний підхід:
- типовий сайт без медіа - вимкнути камеру, мікрофон, геолокацію, платежі, USB й інші непотрібні можливості;
- там, де можливість справді потрібна (відеодзвінки, мапа з геолокацією), - дозволити лише
selfі, можливо, конкретним доменам; - перевіряти після додавання нових функцій: заголовок, що вимикає геолокацію, тихо зламає нову кнопку «Знайти поруч».
Обмеження: це захист «в глибину», а не основний: якщо сайт уже має XSS, проблема серйозніша за доступ до камери. Але заголовок дешевий і закриває цілий клас зловживань.