Content Security Policy und Ihre CMP: CSP und Einwilligung zusammenbringen
Zwei Sicherheitsebenen, die sich einig sein müssen
Eine Content Security Policy (CSP) teilt dem Browser mit, aus welchen Quellen eine Seite Skripte, Stile, Bilder, Frames und Netzwerkanfragen laden darf. Eine Consent-Management-Plattform erfüllt die gegenteilige Aufgabe: Sie entscheidet anhand der Wahl des Nutzers, welche dieser Skripte laufen dürfen. Werden beide getrennt konfiguriert, geraten sie aneinander. Die CMP lädt nicht, weil die CSP sie blockiert, oder die CSP wird so weit gelockert, um CMP und Ad-Tags unterzubringen, dass sie nichts mehr schützt.
Dieser Leitfaden erklärt, welche CSP-Direktiven eine CMP typischerweise braucht, wie Nonces mit Skriptinjektion zusammenspielen und wie Sie Änderungen ausrollen, ohne Ihr Banner zu zerstören.
Was eine CMP üblicherweise von der CSP braucht
Die genauen Anforderungen hängen vom Anbieter ab, gehen Sie also immer von der Dokumentation Ihrer CMP aus. Prüfen Sie im Allgemeinen diese Direktiven:
script-src— die Domain, von der das CMP-Skript lädt, plus alle weiteren Skriptdateien, die es lädt.connect-src— Endpunkte, die die CMP mitfetchoder XHR aufruft, etwa für Konfiguration, Anbieterliste, Geolokalisierung und Einwilligungsprotokollierung.style-src— die Domain des Stylesheets und möglicherweise Inline-Stile, falls die CMP ein<style>-Element einfügt oder Style-Attribute setzt.img-src— Logos, Symbole und alle trackingfreien Pixel, die die CMP verwendet.font-src— falls das Banner eigene Schriftarten lädt.frame-src— falls die CMP Iframes nutzt, zum Beispiel für den domainübergreifenden Austausch der Einwilligung.
Denken Sie bei TCF-Websites daran, dass die CMP auf der Seite außerdem einen Locator-Frame namens __tcfapiLocator erzeugt. Dieser Frame wird ohne entfernte Quelle erstellt und braucht daher normalerweise keinen frame-src-Eintrag, was Sie aber im Test bestätigen sollten.
Das Problem mit dem Inline-Stub
Die meisten CMPs verlangen, dass Sie ein kleines Inline-Skript — den Stub — in den Seitenkopf setzen, damit andere Skripte Aufrufe in die Warteschlange stellen können, bevor die eigentliche CMP lädt. Eine strenge CSP blockiert Inline-Skripte, sofern Sie sie nicht ausdrücklich erlauben. Dafür gibt es drei Möglichkeiten:
- Ein Nonce. Erzeugen Sie pro Antwort einen Zufallswert, tragen Sie ihn als
'nonce-...'in den CSP-Header und in das<script>-Tag des Stubs ein. Das ist die flexibelste Option für dynamische Seiten. - Ein Hash. Fügen Sie den SHA-256-Hash des exakten Stub-Inhalts zu
script-srchinzu. Das funktioniert gut für statische Websites, doch jede Änderung am Stub, selbst an Leerzeichen, bricht es. - Den Stub selbst hosten als externe Datei auf Ihrer eigenen Domain, abgedeckt durch
'self'. Dabei müssen Sie darauf achten, dass er früh genug lädt.
Vermeiden Sie 'unsafe-inline' als Abkürzung. Es erlaubt jedes Inline-Skript und beseitigt einen Großteil des Schutzes, den die CSP bietet.
Nonces und von der CMP injizierte Skripte
Eine CMP, die Skripte bis zur Einwilligung blockiert, funktioniert oft so, dass sie sie zurückhält und später injiziert. Unter einer Nonce-basierten CSP müssen auch diese injizierten Skripte erlaubt sein. Es gibt zwei gängige Ansätze:
- Nonce-Weitergabe. Die CMP liest den Nonce aus ihrem eigenen Script-Tag und fügt ihn jedem Skript hinzu, das sie injiziert. Prüfen Sie, ob Ihre CMP das unterstützt.
'strict-dynamic'. Dieses Schlüsselwort weist unterstützende Browser an, Skripten zu vertrauen, die von einem bereits vertrauenswürdigen Skript geladen werden. Es vereinfacht den Umgang mit Tag-Managern und CMPs, die Skripte injizieren, bedeutet aber auch, dass jedes Skript, dem Sie vertrauen, weitere laden kann – vertrauen Sie also mit Bedacht.
Tag-Manager werfen dieselbe Frage auf. Wenn Sie Werbe- und Analyse-Tags über einen Tag-Manager laden, folgen Sie dessen Dokumentation zu Nonces und achten Sie darauf, dass CMP und Tag-Manager einen einheitlichen Ansatz verwenden.
Ad-Tags erschweren die CSP
Programmatische Werbung lädt Skripte und Frames von vielen Domains, und die Liste ändert sich mit den Demand-Partnern. Publisher entscheiden sich meist für eine von zwei Varianten:
- Eine strenge CSP auf Seiten ohne programmatische Werbung und eine breitere Richtlinie dort, wo Werbung läuft.
- Eine Richtlinie, die sich auf beherrschbare Direktiven wie
frame-ancestors,object-src 'none'undbase-urikonzentriert, während die Skriptquellen breiter bleiben.
In beiden Fällen sollte die CMP ausdrücklich in der Zulassungsliste stehen und nicht nur durch einen Platzhalter abgedeckt sein, damit eine CSP-Änderung das Banner nie unbemerkt abschaltet.
Mit dem Report-Only-Modus ausrollen
Verwenden Sie zuerst den Header Content-Security-Policy-Report-Only. Der Browser meldet Verstöße, ohne etwas zu blockieren, sodass Sie sehen, was eine neue Richtlinie kaputt machen würde.
- Stellen Sie die Richtlinie im Report-Only-Modus mit einem Reporting-Endpunkt bereit.
- Laden Sie Seiten in sauberen Browserprofilen und durchlaufen Sie den gesamten Einwilligungsablauf: erster Besuch, alles akzeptieren, alles ablehnen, individuelle Auswahl, Widerruf.
- Prüfen Sie die Verstoßberichte und die Browserkonsole auf blockierte CMP-Ressourcen.
- Passen Sie die Richtlinie an und schalten Sie dann auf Durchsetzung um.
- Lassen Sie das Reporting nach der Durchsetzung aktiviert, um Regressionen zu erkennen.
Symptome eines CSP-Konflikts
- Das Banner erscheint nie, und die Konsole zeigt einen CSP-Verstoß für das CMP-Skript.
- Das Banner erscheint, ist aber unformatiert, weil
style-srcsein CSS blockiert. - Auswahlen werden nicht gespeichert, weil
connect-srcden Aufruf zur Einwilligungsprotokollierung blockiert. - Werbung oder Analytics laden nach der Einwilligung nie, weil injizierten Skripten ein Nonce fehlt.
__tcfapiist nicht definiert, weil der Inline-Stub blockiert wurde.
Wichtigste Erkenntnisse
- Prüfen Sie
script-src,connect-src,style-src,img-srcundframe-srcfür Ihre CMP. - Erlauben Sie den Inline-Stub mit einem Nonce oder Hash, nicht mit
'unsafe-inline'. - Stellen Sie sicher, dass nach der Einwilligung injizierte Skripte einen Nonce erhalten oder durch
'strict-dynamic'abgedeckt sind. - Testen Sie jeden Einwilligungspfad im Report-Only-Modus, bevor Sie durchsetzen.
- Halten Sie die CMP ausdrücklich in der Zulassungsliste, damit CSP-Änderungen sie nicht abschalten können.