Was Permissions Policy steuert – und was nicht
Browser bieten Webseiten Funktionen an, die über das Anzeigen von Inhalten hinausgehen: Kamera und Mikrofon, Standort, Vollbild, Bildschirmfreigabe, USB-Geräte oder die Payment Request API. Viele davon sind policy-gesteuerte Funktionen (policy-controlled features). Für jede dieser Funktionen legt die jeweilige Spezifikation eine Standard-Allowlist fest. Eine Permissions Policy kann eine Funktion für ein Dokument einschränken und für eingebettete Frames gezielt weitergeben. W3C Permissions Policy: Policy-controlled Features
Zwei Auslieferungswege gehören zusammen:
- Der HTTP-Antwortheader
Permissions-Policygilt für das Dokument, mit dem er ausgeliefert wird. Er begrenzt zugleich, was dieses Dokument an eingebettete Frames weitergeben kann. - Das Attribut
allowan einemiframelegt fest, welche Funktionen der eingebettete Inhalt erhalten soll.
Eine Variante als HTML-meta-Element sieht die Spezifikation nicht vor. W3C: Header- und Container-Policies, W3C: Auslieferung
Ohne Header gilt nicht „alles erlaubt“. Kamera, Mikrofon, Standort, Zahlungsschnittstelle, Bildschirmaufnahme, Vollbild und Autoplay haben die Standard-Allowlist 'self'. Sie stehen dem Dokument im Browserfenster und Frames desselben Origins zur Verfügung; ein Frame mit anderem Origin erhält sie nur, wenn das einbettende Dokument sie mit allow weitergibt. Ein fehlender Header ist deshalb kein Nachweis einer ausnutzbaren Lücke. W3C: Default Allowlists, Media Capture and Streams: camera und microphone, Geolocation API
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
| Mechanismus | Beantwortet die Frage | Grenze |
|---|---|---|
Permissions Policy (Permissions-Policy, allow) | Ist eine Funktion in diesem Dokument oder Frame überhaupt verfügbar? | Erteilt keine Nutzerfreigabe. Unterscheidet nicht zwischen eigenen und eingeschleusten Skripten im selben Dokument. |
| Nutzerberechtigung und Permissions API | Hat die Person der Nutzung zugestimmt, und wie ist der aktuelle Berechtigungszustand? | Eine durch Permissions Policy gesperrte Funktion erscheint dort als denied. Freischalten kann die Policy eine Berechtigung nie. |
| Content Security Policy | Welche Skripte, Ressourcen und Einbettungen darf das Dokument laden oder ausführen? | Steuert keine Geräte- oder Browserschnittstellen wie Kamera oder Standort. |
iframe-Attribut sandbox | Welche Grundfähigkeiten wie Skripte, Formulare oder Popups erhält ein Frame? | Eigenes Modell; Permissions Policy ergänzt es und dupliziert es nicht. |
Die Abgrenzung zur Nutzerberechtigung beschreibt die Permissions-Spezifikation ausdrücklich: Eine Funktion kann nie über Permissions Policy „granted“ werden, sondern nur durch die Zustimmung der Person oder eine Browserregel. W3C Permissions: Verhältnis zu Permissions Policy, W3C: andere und verwandte Mechanismen
Daraus folgt die Sicherheitswirkung: Eine Funktion, die Sie für das gesamte Dokument sperren, etwa mit camera=(), steht auch einem kompromittierten oder eingeschleusten Skript in diesem Dokument nicht zur Verfügung. Funktionen, die Ihre Seite selbst verwendet, bleiben dagegen für jedes Skript nutzbar, das im Kontext Ihres Dokuments läuft. self bezeichnet den Origin des Dokuments, nicht „eigene Skripte“. Gegen eingeschleusten Code helfen andere Maßnahmen wie sichere Ausgabe, Content Security Policy und Subresource Integrity.
Der Web Security Check liest den Permissions-Policy-Header der abgerufenen finalen Antwort, prüft seine Syntax und bewertet für ausgewählte Funktionen wie Kamera, Mikrofon und Standort, ob sie gesperrt oder auf den eigenen Origin begrenzt sind. allow-Attribute, Permissions-Policy-Report-Only, weitere Seiten und das tatsächliche Verhalten eines Browsers erfasst diese Momentaufnahme nicht.
Wie Header und allow zusammenwirken
Jedes Dokument erhält zunächst eine geerbte Policy. Im Browserfenster ergibt sie sich aus den Standard-Allowlists. In einem Frame ergibt sie sich aus der Policy des einbettenden Dokuments und aus dem allow-Attribut des iframe. Der eigene Header eines Dokuments kann Funktionen danach nur weiter einschränken. Was das einbettende Dokument gesperrt hat, kann ein Frame mit einem eigenen Header nicht wieder öffnen. W3C: Inherited policies, W3C: Policy aus der Antwort bilden
Für einen Frame mit anderem Origin gilt bei Funktionen mit Standard-Allowlist 'self': Der Header des einbettenden Dokuments darf den Origin des Frames nicht ausschließen, und das iframe muss die Funktion mit allow weitergeben. Auch das einbettende Dokument selbst muss die Funktion erhalten dürfen; eine Liste nur mit dem fremden Origin reicht nicht. Ein eigener Header des Frames oder eine Sperre weiter oben in der Framekette kann die Funktion zusätzlich verweigern. Diese Bedingungen betreffen die Policy; sichere Kontexte, Nutzerfreigaben und weitere API-Voraussetzungen bleiben bestehen. W3C: Vererbung im Container
Lokale Probe · Chromium 147 · Beispiel Geolocation
Wann ein eingebetteter Frame eine Funktion erhält
Einbettendes Dokument auf http://127.0.0.1:PORT, Frame auf http://localhost:PORT. Beide sind unterschiedliche Origins, weil sich der Host unterscheidet. PORT steht für den zufällig gewählten lokalen Port.
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
| Header des einbettenden Dokuments | allow am iframe | Geolocation im Frame |
|---|---|---|
| kein Header | fehlt | gesperrt: Standard-Allowlist 'self' |
| kein Header | allow="geolocation" | verfügbar |
geolocation=(self) | allow="geolocation" | gesperrt: Der Header schließt den Frame-Origin aus. |
geolocation=(self "http://localhost:PORT") | fehlt | gesperrt: Die Weitergabe mit allow fehlt. |
geolocation=(self "http://localhost:PORT") | allow="geolocation" | verfügbar |
geolocation=* | fehlt | gesperrt: Auch * ersetzt allow nicht. |
geolocation=() | allow="geolocation" | gesperrt |
„Verfügbar“ heißt nur, dass die Policy die Funktion zulässt. Die Standortabfrage selbst scheiterte in der Probe weiterhin an der fehlenden Nutzerfreigabe.
Die Browserunterstützung unterscheidet sich stark. Laut den MDN-Kompatibilitätsdaten (Abruf 27.09.2026) wertet Chrome den Header Permissions-Policy seit Version 85 aus; Chromium-basierte Browser wie Edge folgen diesem Stand. Firefox und Safari unterstützen den Header nicht. Das Attribut allow kennen Chrome seit Version 60, Firefox seit 74 und Safari seit 11.1, jeweils mit einer eigenen Liste unterstützter Funktionen. Für Safari verzeichnen die Daten im Attribut etwa camera, microphone und display-capture, nicht aber geolocation oder payment. MDN-Kompatibilitätsdaten: Permissions-Policy, MDN-Kompatibilitätsdaten: iframe allow
Welche Funktionen Sie steuern können
Die folgende Auswahl deckt die häufigsten Fragen ab. Die Arbeitsgruppe führt eine nicht normative Liste standardisierter, vorgeschlagener und experimenteller Funktionen; kein Browser muss jede davon unterstützen. W3C: Feature-Liste zur Spezifikation
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
| Funktion | Steuert zum Beispiel | Standard-Allowlist | Was eine Sperre stören kann |
|---|---|---|---|
camera | Kamerazugriff über getUserMedia() | 'self' | Videoberatung, Identitätsprüfung, Dokumentenscan im Browser |
microphone | Mikrofonzugriff | 'self' | Videokonferenz, Sprachaufnahme, Diktat |
geolocation | Standortabfrage | 'self' | Filialsuche, Kartenwidgets, Liefergebiete |
payment | Payment Request API | 'self' | browserbasierte Zahlarten, auch in eingebetteten Zahlungsdiensten |
usb | WebUSB | 'self' | Gerätekonfiguration über den Browser |
display-capture | Bildschirmfreigabe über getDisplayMedia() | 'self' | Bildschirmteilen in Konferenz- und Supportwerkzeugen |
fullscreen | Vollbild über requestFullscreen() | 'self' | Vollbild eingebetteter Videoplayer |
autoplay | automatische Medienwiedergabe | 'self' | automatisch startende eingebettete Videos |
Belege für die Standard-Allowlists: Media Capture and Streams, Geolocation, Payment Request, Screen Capture, Fullscreen, HTML: autoplay, WebUSB: Permissions Policy
Die Tabelle ist keine Vorlage. Ob () oder eine Freigabe passt, entscheidet allein, ob Ihr Dokument oder eine Einbettung die Funktion tatsächlich braucht. Sperren Sie etwa autoplay mit autoplay=(self), können eingebettete Videoplayer anderer Origins die Funktion auch mit allow="autoplay" nicht mehr erhalten.
Den Header richtig schreiben
Der Wert von Permissions-Policy ist ein Structured-Field-Dictionary nach RFC 9651. Funktionen werden durch Kommas getrennt, jede Funktion erhält eine Allowlist. Funktionsnamen stehen kleingeschrieben, Origins als Zeichenketten in doppelten Anführungszeichen. W3C: Structured Header Serialization, RFC 9651: Dictionaries
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
| Schreibweise im Header | Bedeutung |
|---|---|
camera=() | Leere Allowlist: Die Funktion ist im Dokument und in allen Frames gesperrt. |
geolocation=(self) oder geolocation=self | Nur der Origin des Dokuments; Frames desselben Origins erben die Funktion. |
geolocation=(self "https://maps.example.com") | Zusätzlich dieser Origin. Ein Frame dieses Origins braucht weiterhin allow. |
payment=(self "https://*.example.com") | Unterdomains über ein Platzhalterzeichen. https://example.com selbst ist damit nicht erfasst. |
fullscreen=* | Alle Origins. Frames mit Standard-Allowlist 'self' brauchen trotzdem allow. |
Platzhalter für Unterdomains sind laut MDN-Kompatibilitätsdaten erst seit Chrome 108 unterstützt. Verschiedene Unterdomains und Ports sind verschiedene Origins; https://www.example.com deckt https://shop.example.com nicht ab. W3C: Beispiele
Das folgende Modell passt zu einer Website, die keine der genannten Funktionen selbst nutzt und keiner Einbettung weitergeben muss. Es ist ein Headerbeispiel, keine geprüfte Vorlage für Ihre Anwendung:
Permissions-Policy: camera=(), microphone=(), geolocation=(), display-capture=(), usb=()Weitere Beobachtungen aus der Probe, die dem Regelwerk entsprechen:
- Unbekannte Funktionsnamen ignoriert der Browser einzeln; die übrigen Einträge gelten weiter.
- Origins ohne Anführungszeichen wie
(self http://localhost:PORT)verwarf Chromium als ungültigen Eintrag mit Konsolenwarnung. Der Frame erhielt die Funktion nicht. noneist kein Header-Schlüsselwort. Chromium meldetegeolocation=noneals ungültig und behandelte die Allowlist als leer. Schreiben Sie für eine Sperre().- Mehrere Headerzeilen werden zu einer Liste zusammengeführt. Nennen zwei Zeilen dieselbe Funktion, gilt der zuletzt stehende Wert. Setzen Anwendung und CDN beide den Header, entscheidet also die Reihenfolge in der ausgelieferten Antwort. RFC 9651: Dictionaries parsen
Das allow-Attribut verwendet eine andere Schreibweise: Semikolons trennen die Funktionen, Schlüsselwörter stehen in einfachen Anführungszeichen, Origins ohne Anführungszeichen. Ohne Allowlist gilt 'src', also der Origin der URL im src-Attribut. W3C: HTML-Attribut-Serialisierung, W3C: allow-Attribut
<iframe src="https://maps.example.com/embed" allow="geolocation"></iframe>
<iframe src="https://video.example.net/room" allow="camera; microphone; display-capture"></iframe>Permissions Policy in vier Schritten einführen
1. Genutzte Funktionen und Einbettungen erfassen
Erfassen Sie, welche Funktionen Ihre eigenen Seiten verwenden und welche eingebetteten Dienste welche Funktionen brauchen: Karten, Videoplayer, Videokonferenz, Zahlungsdienste, Chat- oder Supportwerkzeuge, Anmelde- und Identitätsdienste sowie Erweiterungen in CMS und Shopsystemen. Notieren Sie für jede Einbettung den genauen Origin einschließlich Unterdomain und Port.
Legen Sie außerdem fest, welche zuständige Ausgabestelle den Header setzt: Anwendung, Webserver, Reverse Proxy oder CDN. Zwei Stellen, die unabhängig voneinander Werte hinzufügen, führen leicht zu widersprüchlichen Einträgen. Der Artikel zu Implementierung und Architektur behandelt diese Zuständigkeiten. Permissions Policy gilt je Dokument: Soll dieselbe Begrenzung auf allen Seiten gelten, muss sie auch mit Anmelde-, Checkout- und Fehlerdokumenten ausgeliefert werden.
2. Neue Sperren zuerst beobachten
In Chromium-basierten Browsern können Sie Regeln mit Permissions-Policy-Report-Only zunächst beobachten. Laut MDN-Kompatibilitätsdaten ist dieser Header seit Chrome 120 verfügbar; Firefox und Safari unterstützen ihn nicht. In der lokalen Probe blieb die Standortabfrage unter Permissions-Policy-Report-Only: geolocation=() erlaubt; der Browser erzeugte einen Bericht mit der Kennzeichnung report. W3C: Report-Only-Header, MDN-Kompatibilitätsdaten: Report-Only
Reporting-Endpoints: pp-endpoint="https://reports.example.com/permissions-policy"
Permissions-Policy-Report-Only: camera=();report-to=pp-endpoint, microphone=();report-to=pp-endpoint, geolocation=();report-to=pp-endpointhttps://reports.example.com/permissions-policy ist ein Platzhalter für einen Empfänger, den Sie selbst betreiben; der Header richtet keinen ein. Berichte können bei einem Nutzungsversuch entstehen; die Spezifikation sieht außerdem Berichte über mögliche Konflikte zwischen Frame-Freigabe und geerbter Policy vor. Eine Report-Only-Policy setzt parallel bestehende Sperren nicht außer Kraft. Ausbleibende Berichte beweisen daher nicht, dass keine Seite und keine Einbettung die Funktion braucht. Wie Berichte zugestellt und ausgewertet werden, erklärt der Ratgeber zur Reporting API. W3C: Reporting
3. Nicht benötigte Funktionen sperren und benötigte gezielt freigeben
Die folgenden Ausschnitte zeigen die Konfigurationsform für nginx und Apache. Sie sind nicht ausgeführt und setzen voraus, dass Ihre Seiten die genannten Funktionen nicht brauchen.
nginx: add_header wirkt im Kontext http, server oder location. Solche Direktiven werden nur geerbt, wenn auf der aktuellen Ebene keine eigene add_header-Direktive steht; seit nginx 1.29.3 lässt sich das mit add_header_inherit ändern. Ohne always fügt nginx den Header nur bei bestimmten Statuscodes wie 200 oder 301 hinzu. Nach der Änderung ist ein erfolgreicher Reload nötig. nginx: add_header
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" always;Apache: Der Ausschnitt setzt mod_headers voraus; in .htaccess muss die Konfiguration erlaubt sein, etwa über AllowOverride FileInfo. Ohne geladenes Modul überspringt Apache den Inhalt von IfModule stillschweigend. always und die Standardtabelle onsuccess sind getrennte Headerlisten; ein Header aus einem Backend kann dadurch doppelt ankommen. Apache: Header-Direktive
<IfModule mod_headers.c>
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()"
</IfModule>payment=() passt nur, wenn weder Ihre Seite noch ein eingebetteter Zahlungsdienst die Payment Request API nutzt. Braucht eine Einbettung eine Funktion, geben Sie sie an beiden Stellen frei. Im folgenden Modell erhält nur der Videodienst Kamera und Mikrofon:
Permissions-Policy: camera=(self "https://video.example.net"), microphone=(self "https://video.example.net"), geolocation=()<iframe src="https://video.example.net/room/123" allow="camera; microphone"></iframe>https://video.example.net steht für den tatsächlichen Origin des eingebetteten Dienstes. Leitet der Dienst den Frame auf einen anderen Origin weiter, gilt die Freigabe dort nicht automatisch.
4. Wirkung prüfen und einen Rückweg bereithalten
Prüfen Sie zuerst, welcher Header tatsächlich ankommt. Für eine berechtigte eigene Adresse zeigt der folgende Aufruf die Header jeder Antwort in einer Weiterleitungskette; der letzte Block gehört zur finalen Antwort:
curl -sS -L -D - -o /dev/null https://www.example.com/https://www.example.com/ ist ein Platzhalter; der Aufruf wurde nicht gegen eine echte Website ausgeführt. Er zeigt eine einzelne Antwort und kein Browserverhalten.
Im Browser meldet Chromium Verstöße in der Konsole, etwa „Permissions policy violation: Geolocation access has been blocked …“, und nennt Parsefehler des Headers. Chromium stellt die Abfrage der wirksamen Policy unter dem älteren Namen document.featurePolicy bereit, zum Beispiel document.featurePolicy.allowsFeature('camera'). Die Spezifikation nennt die Schnittstelle document.permissionsPolicy; in Chromium 141 war dieser Name in der Probe nicht vorhanden. Testen Sie benötigte Einbettungen zusätzlich in Firefox und Safari, weil dort nur das allow-Attribut und die eigenen Standardregeln wirken. W3C: Policy-Introspektion
Die Rücknahme ist einfacher als bei HSTS: Browser speichern eine Permissions Policy nicht über das Dokument hinaus. Entfernen oder lockern Sie den Header an der zuständigen Ausgabestelle, gilt das für neu geladene Dokumente. Zwischengespeicherte HTML-Antworten in einem CDN, im Browsercache oder in einem Service Worker können den alten Header aber weiter ausliefern, bis sie erneuert werden. Planen Sie deshalb gegebenenfalls ein Leeren der Caches ein. Der Ratgeber zu Cache-Control erklärt die Zwischenspeicher.
Befunde richtig einordnen
Ein fehlender Header zeigt nur, dass für dieses Dokument die Standardregeln des jeweiligen Browsers gelten. Ein vorhandener Header zeigt, welche Regeln ein unterstützender Browser für diese Antwort anwenden kann. Keine der beiden Beobachtungen ist ein Nachweis für oder gegen eine ausnutzbare Lücke.
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
| Beobachtung | Was sie zeigt | Nächster Schritt |
|---|---|---|
| Header fehlt in der geprüften Antwort | Es fehlt eine eigene Header-Policy; Browserdefaults und bei Frames geerbte Einschränkungen können weiter gelten. | Inventar prüfen; bei Bedarf nicht benötigte Funktionen sperren. Andere Seiten können abweichen. |
| Header vorhanden, Funktionen gesperrt | Unterstützende Browser sperren diese Funktionen für das Dokument und seine Frames. | Kein Schutz vor eingeschleustem Code in genutzten Funktionen; keine Wirkung in Browsern ohne Header-Unterstützung. |
| Konsole meldet einen Structured-Field-Parsefehler | Der Browser verwirft das gesamte Feld. Warnungen zu einzelnen Allowlist-Einträgen sind davon zu unterscheiden. | Syntax korrigieren: doppelte Anführungszeichen, Kleinschreibung, Kommas. |
| Zwei Headerzeilen oder ein CDN ergänzt Werte | Die Zeilen werden zusammengeführt; je Funktion gilt der letzte Wert. | Eine Ausgabestelle festlegen und die ausgelieferte Antwort prüfen. |
Funktion im Frame trotz allow gesperrt | Mögliche Ursache: Der Header schließt den Frame- oder Eltern-Origin aus. Auch andere Vorfahren, der Frame-Header, Browserunterstützung oder Nutzerberechtigungen kommen infrage. | Die gesamte Framekette und den konkreten API-Fehler prüfen; nur eine gewollte Freigabe erweitern. |
| Funktion im Frame trotz Freigabe im Header gesperrt | Mögliche Ursache: Das allow-Attribut fehlt oder nennt die Funktion nicht. | allow am betreffenden iframe ergänzen. |
Feature-Policy und Permissions-Policy parallel | Chromium verwendet für doppelt genannte Funktionen den Wert aus Permissions-Policy. | Alten Header nach der Umstellung entfernen. |
Ein Befund des Web Security Check bezieht sich auf den Header einer einzelnen abgerufenen Antwort zum Zeitpunkt des Abrufs. Ob Einbettungen funktionieren und welche Funktionen im Browser tatsächlich verfügbar sind, klären erst die Browserprüfungen aus Schritt 4.
Von Feature-Policy umstellen
Permissions Policy hieß früher Feature Policy. Der alte Header Feature-Policy hat eine andere Schreibweise und gilt als veraltet. Laut MDN-Kompatibilitätsdaten verarbeitet Chrome ihn seit Version 60 weiterhin; Firefox und Safari werten ihn nicht aus. W3C: Einführung, MDN-Kompatibilitätsdaten: Feature-Policy
Bei schmaler Ansicht können Sie die Tabelle seitlich scrollen.
Feature-Policy (veraltet) | Permissions-Policy |
|---|---|
camera 'none' | camera=() |
geolocation 'self' | geolocation=(self) |
geolocation 'self' https://maps.example.com | geolocation=(self "https://maps.example.com") |
fullscreen * | fullscreen=* |
Einträge durch ; getrennt | Einträge durch , getrennt |
In der lokalen Probe mit Chromium 147 sperrte Feature-Policy: geolocation 'none' allein die Standortabfrage weiterhin. Standen beide Header in der Antwort, galt je Funktion der Wert aus Permissions-Policy; die Konsole meldete die Doppelung. Eine Funktion, die nur im alten Header stand, blieb gesperrt. Chrome beschreibt Feature-Policy als Alias mit niedrigerer Priorität. Chrome for Developers: Permissions Policy
Beachten Sie bei der Umstellung eine Verhaltensänderung: Unter Feature Policy konnte ein Origin in der Header-Liste genügen, um einem fremden Frame eine Funktion zu geben. Unter Permissions Policy braucht der Frame zusätzlich allow. Übersetzen Sie den alten Header, testen Sie betroffene Einbettungen und entfernen Sie Feature-Policy anschließend. Weitere veraltete Header behandelt der Ratgeber zu erweiterten Headern.
Nachweis und Einordnung
Permissions Policy ist eine technische Maßnahme, die ausgewählte Browserfunktionen begrenzt. Ein vorhandener Header ist weder eine allgemeine gesetzliche Pflicht noch ein Konformitätsnachweis. Wenn Sie die Maßnahme dokumentieren, halten Sie geprüfte URL, Zeitpunkt, ausgelieferten Header, betroffene Einbettungen und getestete Browser fest.
Datenschutzrechtliche Grundsätze wie Datenminimierung und datenschutzfreundliche Voreinstellungen (Art. 5 und 25 DSGVO, BfDI-Gesetzessammlung) betreffen die gesamte Verarbeitung. Eine gesperrte Geräteschnittstelle kann dazu beitragen, ersetzt aber keine Bewertung der Verarbeitung. Für Einrichtungen im Anwendungsbereich des BSIG verlangt § 30 geeignete Risikomanagementmaßnahmen; welche Header dazu gehören, ergibt sich aus der eigenen Risikobewertung, nicht aus dem Gesetz. Permissions Policy ist außerdem kein Skriptinventar und keine Prüfung des Inhalts eingebundener Skripte. Die Compliance-Übersicht und die NIS2-Checkliste ordnen diese Bezüge ein.
Weiterführende Themen
Wenn Sie zunächst sehen möchten, welchen Header eine öffentlich erreichbare Seite ausliefert, öffnen Sie den Web Security Check. Er wertet eine einzelne Antwort aus; die oben beschriebenen Tests von Einbettungen und Browsern ersetzt er nicht.
Häufig gestellte Fragen
Was ist Permissions Policy?
Permissions Policy ist ein Browsermechanismus, mit dem eine Website festlegt, ob policy-gesteuerte Funktionen wie Kamera, Mikrofon oder Standort in ihrem Dokument und in eingebetteten Frames verfügbar sind. Sie wird über den Header Permissions-Policy und das iframe-Attribut allow gesteuert. camera=() sperrt die Kamera in unterstützenden Browsern für das Dokument und alle Frames. Eine Nutzerfreigabe ersetzt die Policy nicht.
Welche Browser unterstützen den Header?
Laut MDN-Kompatibilitätsdaten wertet Chrome den Header seit Version 85 aus, Chromium-basierte Browser wie Edge ebenso. Firefox und Safari unterstützen den Header nicht, kennen aber das allow-Attribut für einzelne Funktionen. Ein gesendeter Header bedeutet deshalb nicht, dass jeder Besucher dieselben Sperren erhält.
Kann Permissions Policy meine Website beeinträchtigen?
Ja. Eine Sperre kann Videogespräche, Kartenfunktionen, Bildschirmfreigabe, Vollbild oder browserbasierte Zahlarten verhindern, auch in eingebetteten Diensten. Erfassen Sie benötigte Funktionen vorab, beobachten Sie neue Regeln in Chromium mit Permissions-Policy-Report-Only und testen Sie Einbettungen in allen Zielbrowsern.
Was ist der Unterschied zu Feature-Policy?
Feature-Policy ist der veraltete Vorgänger mit anderer Syntax, etwa camera 'none' statt camera=(). Permissions-Policy nutzt ein Structured-Field-Dictionary mit Kommas zwischen den Funktionen, self ohne Anführungszeichen und Origins in doppelten Anführungszeichen. Außerdem braucht ein Frame mit anderem Origin für Funktionen wie Kamera oder Standort unter Permissions Policy zusätzlich das allow-Attribut.
Brauche ich Permissions Policy, wenn ich keine Kamera nutze?
Eine ausdrückliche Sperre nicht benötigter Funktionen kann sinnvoll sein, weil sie diese Funktionen auch für eingebettete oder eingeschleuste Inhalte im Dokument unerreichbar macht. Ein fehlender Header beweist aber keinen unbemerkten Kamerazugriff: Die Standardregeln der Browser, sichere Kontexte und Nutzerberechtigungen gelten weiter.
Schützt Permissions Policy vor kompromittierten Drittanbieter-Skripten?
Nur eingeschränkt. Ein Skript, das in Ihrem Dokument läuft, hat dieselben Funktionen wie Ihre Seite. Gesperrte Funktionen kann es nicht nutzen, freigegebene dagegen schon. Gegen manipulierte oder eingeschleuste Skripte helfen andere Maßnahmen wie Content Security Policy, Subresource Integrity und die Kontrolle eingebundener Dienste.
Warum funktioniert eine Funktion im iframe trotz allow nicht?
Häufig schließt der Permissions-Policy-Header der einbettenden Seite den Origin des Frames aus, etwa bei geolocation=(self). Für einen fremden Frame müssen Header und allow die Funktion beide zulassen. Weitere Ursachen sind ein ungültiger Header, eine Weiterleitung des Frames auf einen anderen Origin oder ein Browser, der die Funktion im Attribut nicht unterstützt.
Ist Permissions Policy für NIS2 relevant?
Sie kann eine technische Maßnahme sein, um bestimmte Browserfunktionen zu begrenzen. Der Header allein belegt weder NIS2-Konformität noch vollständige Datenminimierung. Welche Maßnahmen nötig sind, ergibt sich aus Anwendungsbedarf, Risikoanalyse und tatsächlicher Wirkung in den genutzten Browsern.
Quellen und technischer Stand
- W3C Permissions Policy
: Working Draft vom 22.09.2026, Editor's Draft mit gleichem Stand; Mechanismus, Syntax, Vererbung, Report-Only und Reporting. Noch keine W3C-Empfehlung. - Feature-Liste zur Spezifikation
: nicht normative Übersicht standardisierter, vorgeschlagener, experimenteller und zurückgezogener Funktionen. - W3C Permissions, Anhang A
: Editor's Draft vom 06.10.2025; Verhältnis von Nutzerberechtigung und Permissions Policy.
- Standard-Allowlists aus Media Capture and Streams (Candidate Recommendation Draft 09.10.2025), Geolocation (Candidate Recommendation Snapshot 26.03.2026), Payment Request (Candidate Recommendation Draft 22.06.2026), Screen Capture (Working Draft 27.08.2026), HTML und Fullscreen (Living Standards).
- RFC 9651: Structured Field Values for HTTP, September 2024; ersetzt RFC 8941. Parsing, Dictionaries und doppelte Schlüssel.
- MDN: Permissions-Policy und die MDN-Kompatibilitätsdaten: Browsererklärung und Unterstützung von Header, Report-Only, Feature-Policy und
allow-Attribut, abgerufen am 27.09.2026. - Chrome for Developers: Permissions Policy: Verhältnis zu Feature-Policy in Chrome; Stand der Seite April 2022.
- nginx: Header-Modul und Apache: mod_headers: Voraussetzungen der Konfigurationsausschnitte.
Quellenstand: 27.09.2026. Das Zusammenspiel von Header und allow, Syntaxfehler, doppelte Header, Feature-Policy und Report-Only wurden lokal in Chromium 147.0.7727.15 ohne Bildschirm auf einem Testserver geprüft. Eine ältere Probe in Chromium 141 belegt den dort genannten Introspektionsnamen. Firefox, Safari, die aktuelle stabile Chrome-Ausgabe und die nginx-/Apache-Beispiele wurden nicht praktisch geprüft.