Permissions-Policy im HTTP verständlich erklärt: Browser-Features
Der HTTP-Response-Header Permissions-Policy (ehemals Feature-Policy) ist eine leistungsstarke Sicherheitsanweisung für moderne Browser. Er ermöglicht es Webmastern, den Zugriff auf hardwarebasierte APIs und Browser-Funktionen (wie Kamera, Mikrofon, GPS-Standort, USB-Geräte oder das Auslesen der Zwischenablage) für die eigene Website sowie für alle eingebetteten iframes von Drittanbietern gezielt zu erlauben, einzuschränken oder komplett zu verbieten.
In modernen Webanwendungen werden immer häufiger externe Skripte integriert – sei es für Web-Analytics, Chat-Widgets oder Werbenetzwerke. Die Permissions-Policy dient als Schutzschild auf Protokollebene, um sicherzustellen, dass diese Drittanbieter-Skripte keine unbefugten Zugriffe auf die Hardware oder Privatsphäre des Nutzers durchführen können.
Fokus dieser Seite: Hier liegt der Schwerpunkt auf der technischen Funktionsweise des HTTP-Headers – Syntax, Direktiven und Server-Konfiguration. Die reine Sicherheitsperspektive (Angriffsfläche, Bedrohungsmodelle, Zero-Trust) behandelt die Schwesterseite Permissions-Policy als Security Header.
Das Sicherheitsprinzip: Angriffsflächen minimieren
Moderne Browser bieten Webseiten über JavaScript-APIs Zugriff auf zahlreiche Hardware- und Betriebssystemkomponenten. Dies bringt gravierende Risiken mit sich:
- Wird eine Applikation durch das Einbinden eines gehackten Widgets kompromittiert, könnte das fremde Skript versuchen, den Standort des Nutzers abzufragen, Tastenanschläge über Bewegungssensoren zu analysieren oder unbemerkt Audio-Aufnahmen zu starten.
- Die Permissions-Policy verhindert dies auf Browserebene. Wenn der Webserver deklariert, dass die Kamera auf der Website niemals genutzt werden darf, verweigert der Browser jeden Zugriffsversuch – selbst wenn das schadhafte Skript mit vollen Rechten im Frontend ausgeführt wird.
Permissions-Policy vs. Feature-Policy
Die Permissions-Policy hat die ältere Feature-Policy abgelöst. Beide steuern dieselben Browser-Features, unterscheiden sich aber in Syntax und Status:
| Merkmal | Feature-Policy (alt) | Permissions-Policy (aktuell) |
|---|---|---|
| Status | veraltet (deprecated) | aktueller Standard |
| Syntax | geolocation 'self' | geolocation=(self) |
| Quellen-Format | Leerzeichen + Anführungszeichen | strukturierte Felder (RFC 8941) |
| Feature abschalten | geolocation 'none' | geolocation=() |
| Empfehlung | nicht mehr verwenden | ausschliesslich verwenden |
Für neue Projekte gilt: Nur noch Permissions-Policy setzen. Ein paralleles Senden beider Header ist nicht nötig, da alle relevanten Browser die moderne Variante verstehen.
Syntax und Aufbau des Headers
Die Permissions-Policy nutzt die Syntax für strukturierte HTTP-Header-Felder (RFC 8941). Die Direktiven werden in Klammern definiert, wobei mehrere Features per Komma getrennt werden. Die Werte innerhalb der Klammern spezifizieren die erlaubten Quellen (Origins):
Permissions-Policy: geolocation=(self "https://allerate.dev"), camera=(), microphone=*
Die wichtigsten Quellen-Deklarationen:
self: Das Feature darf nur von Skripten der eigenen Domain (Origin) genutzt werden.*(Wildcard): Das Feature ist für alle Domains und eingebetteten iframes uneingeschränkt freigegeben.()(Leere Klammer): Das Feature ist vollständig deaktiviert. Weder die Hauptseite noch eingebettete iframes dürfen darauf zugreifen."https://...": Das Feature ist für die eigene Domain und explizit für die angegebene externe Domain freigegeben. Mehrere externe Domains werden durch Leerzeichen getrennt.
Die wichtigsten Feature-Direktiven im Überblick
Die Permissions-Policy deckt eine breite Palette an Geräte- und API-Steuerungen ab. Hier sind die am häufigsten genutzten Direktiven:
| Direktive | Steuert den Zugriff auf | Empfohlene Einstellung |
|---|---|---|
geolocation | Die geografische Position des Nutzers (GPS). | () (oder self bei Kartendiensten) |
camera | Die eingebaute Webcam oder Kamera. | () (oder self bei Video-Identifikation) |
microphone | Das integrierte Mikrofon für Audio-Aufnahmen. | () |
payment | Die Payment Request API des Browsers (Apple Pay, Google Pay). | () (oder self im Warenkorb) |
usb | Zugriff auf lokal angeschlossene USB-Geräte via WebUSB API. | () |
display-capture | Die Möglichkeit, den Bildschirm des Nutzers aufzunehmen. | () |
fullscreen | Das Umschalten in den Vollbildmodus. | self |
accelerometer | Den Beschleunigungssensor des Endgeräts. | () |
gyroscope | Den Gyroskopsensor (Drehgeschwindigkeit). | () |
Server-Konfigurationsbeispiele
Um die Permissions-Policy auszuliefern, müssen Sie Ihren Webserver so konfigurieren, dass er den entsprechenden HTTP-Header mitsendet.
Nginx-Konfiguration
Fügen Sie die folgende Zeile in Ihren server- oder location-Block in der nginx.conf ein:
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" always;
Apache (.htaccess)
Nutzen Sie das mod_headers-Modul, um den Header zu setzen:
Header set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()"
Next.js (next.config.js)
In modernen React-Frameworks können Sie Header direkt konfigurieren:
module.exports = {
async headers() {
return [
{
source: '/(.*)',
headers: [
{
key: 'Permissions-Policy',
value: 'camera=(), microphone=(), geolocation=(), payment=(), usb=()',
},
],
},
];
},
};
Best Practice für Informationsplattformen
Für reine Informationsplattformen (wie allerate.com) werden in der Regel keine Hardware-APIs benötigt. Eine strikte Permissions-Policy zur maximalen Härtung sieht vor, alle ungenutzten Features komplett abzuschalten:
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), display-capture=()
Diese Header-Einstellung schützt Ihre Nutzer effektiv vor unbefugten Hardware-Zugriffen durch eingebundene Analysetools, Werbebanner oder kompromittierte Skripte.
Vorher/Nachher: Eine Kartendomain gezielt freigeben
Eine Website bindet einen externen Kartendienst per iframe ein, der den Standort des Nutzers braucht – alle anderen Features sollen aber gesperrt bleiben:
- Vorher (zu offen): Es wird gar keine Permissions-Policy gesendet. Jedes eingebundene Skript kann versuchen, Standort, Kamera oder Mikrofon abzufragen; der Browser zeigt entsprechende Berechtigungsdialoge, die Nutzende verunsichern.
- Nachher (gezielt): Der Server sendet
geolocation=(self "https://maps.example.com"), camera=(), microphone=(). Damit darf ausschliesslich die eigene Domain und der vertrauenswürdige Kartendienst den Standort nutzen, während Kamera und Mikrofon vollständig gesperrt bleiben.
Permissions-Policy: geolocation=(self "https://maps.example.com"), camera=(), microphone=()
Die Lehre: Die Permissions-Policy erlaubt feingranulare Freigaben pro Feature und pro Origin. So bleibt die Angriffsfläche minimal, ohne legitime Funktionen zu blockieren. Für das Absichern von Skript-Quellen kombinieren Sie den Header sinnvoll mit der Content-Security-Policy, für Cross-Origin-Anfragen mit korrekten CORS-Headern.
[!TIP] Die Permissions-Policy ist ein wichtiger Baustein für das Härten von Web-Infrastrukturen und schützt die Privatsphäre Ihrer Anwender. Validieren Sie die Richtlinien Ihrer Website live mit dem HTTP Header Check auf balou.tools. Eine Übersicht über weitere praktische Werkzeuge finden Sie in den Developer Tools.
Häufig gestellte Fragen (FAQ)
Was ist der Unterschied zwischen Feature-Policy und Permissions-Policy?
Permissions-Policy ist der offizielle, moderne Nachfolger von Feature-Policy. Er nutzt eine neue, strukturierte Syntax (Structured Fields for HTTP), die Funktionalität ist jedoch weitgehend identisch.
Können eingebettete iframes eine Permissions-Policy umgehen?
Nein. Eine Permissions-Policy auf der Hauptseite schränkt auch alle eingebetteten iframes ein. Selbst wenn das iframe-Attribut `allow="geolocation"` gesetzt ist, greift die Einschränkung der übergeordneten Policy.
Was passiert, wenn ein Feature in der Permissions-Policy gar nicht genannt wird?
Dann gilt der Standardwert des jeweiligen Features laut Spezifikation – bei den meisten ist das `self`, also nur die eigene Domain. Wer ein Feature sicher abschalten will, muss es explizit mit leeren Klammern `()` aufführen; das blosse Weglassen reicht nicht.
Muss ich jedes Browser-Feature einzeln auflisten?
Sie müssen nur die Features aufführen, deren Standardverhalten Sie ändern wollen. In der Praxis listet man alle sensiblen Hardware-Features explizit mit `()` auf, um eine klare, dokumentierte Härtungsbasis zu schaffen – auch wenn manche bereits per Standard eingeschränkt wären.