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:

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:

  1. 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.
  2. Ein Hash. Fügen Sie den SHA-256-Hash des exakten Stub-Inhalts zu script-src hinzu. Das funktioniert gut für statische Websites, doch jede Änderung am Stub, selbst an Leerzeichen, bricht es.
  3. 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:

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:

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.

  1. Stellen Sie die Richtlinie im Report-Only-Modus mit einem Reporting-Endpunkt bereit.
  2. Laden Sie Seiten in sauberen Browserprofilen und durchlaufen Sie den gesamten Einwilligungsablauf: erster Besuch, alles akzeptieren, alles ablehnen, individuelle Auswahl, Widerruf.
  3. Prüfen Sie die Verstoßberichte und die Browserkonsole auf blockierte CMP-Ressourcen.
  4. Passen Sie die Richtlinie an und schalten Sie dann auf Durchsetzung um.
  5. Lassen Sie das Reporting nach der Durchsetzung aktiviert, um Regressionen zu erkennen.

Symptome eines CSP-Konflikts

Wichtigste Erkenntnisse

← Blog Alle lesen →