Start/Header/Content-Security-PolicyContent-Security-PolicyVerwendung Der Content-Security-Policy-Header (CSP) gibt Website-Administratoren eine feingranulare Kontrolle über das Laden von Ressourcen. Durch das Deklarieren einer Richtlinie weist der Server den Browser an, Skripte, Stylesheets, Bilder, Schriftarten und andere Ressourcen ausschließlich aus genehmigten Quellen zu laden. Jede Ressource, die nicht zur Richtlinie passt, wird blockiert, und der Browser meldet den Verstoß. Eine Richtlinie besteht aus einer oder mehreren durch Semikolon getrennten Direktiven. Jede Direktive benennt einen Ressourcentyp und listet die für diesen Ressourcentyp erlaubten Quellen auf. Content-Security-Policy: <directive> <source>; <directive> <source> Eine neue Richtlinie zunächst im Report-Only-Modus auszurollen, ist gängige Praxis. Der Header Content-Security-Policy-Report-Only verwendet dieselbe Syntax, protokolliert Verstöße jedoch, ohne Ressourcen zu blockieren, sodass Administratoren eine Richtlinie vor der Durchsetzung testen können. Fetch-Direktiven Fetch-Direktiven steuern, von welchen Orten bestimmte Ressourcentypen geladen werden. default-src Die Direktive default-src dient als Rückfallebene für alle anderen Fetch-Direktiven. Fehlt eine spezifische Fetch-Direktive, greift der Browser auf default-src zurück. Content-Security-Policy: default-src 'self' script-src Die Direktive script-src schränkt die Quellen für die JavaScript-Ausführung ein. Nonce- und Hash-basierte Erlaubnislisten bieten einen stärkeren Schutz als hostbasierte Regeln. script-src-elem Die Direktive script-src-elem gilt speziell für script-src-attr Die Direktive script-src-attr regelt Inline-Event-Handler wie onclick und onload, unabhängig vom Laden von style-src Die Direktive style-src legt gültige Quellen für CSS-Stylesheets fest, einschließlich Inline-Styles und Verweisen auf externe Stylesheets. style-src-elem Die Direktive style-src-elem gilt für style-src-attr Die Direktive style-src-attr regelt Inline-Styles, die über das style-Attribut direkt auf DOM-Elemente angewendet werden. img-src Die Direktive img-src legt gültige Quellen für Bilder und Favicons fest. connect-src Die Direktive connect-src schränkt URLs ein, die über Skript-Schnittstellen erreichbar sind, darunter fetch(), XMLHttpRequest, WebSocket und EventSource. font-src Die Direktive font-src legt gültige Quellen für Schriftarten fest, die über @font-face geladen werden. frame-src Die Direktive frame-src legt gültige Quellen für verschachtelte Browsing-Kontexte fest, die von - und -Elementen geladen werden. media-src Die Direktive media-src legt gültige Quellen für -, - und -Elemente fest. object-src Die Direktive object-src schränkt die Quellen für - und -Elemente ein ( ist ein veraltetes Element, das aus der HTML-Spezifikation entfernt wurde). Es empfiehlt sich, sie auf ‘none’ zu setzen, da diese Elemente nur selten benötigt werden. child-src Die Direktive child-src definiert die erlaubten Quellen für Web Worker und verschachtelte Browsing-Kontexte. Die spezifischeren Direktiven frame-src und worker-src überschreiben child-src, sofern sie vorhanden sind. worker-src Die Direktive worker-src gilt für Worker-, SharedWorker- und ServiceWorker-Skripte. manifest-src Die Direktive manifest-src legt gültige Quellen für Manifest-Dateien von Webanwendungen fest. fenced-frame-src Die Direktive fenced-frame-src legt gültige Quellen für verschachtelte Browsing-Kontexte fest, die in -Elemente geladen werden. Fehlt sie, greift der Browser auf frame-src und anschließend auf default-src zurück. Document-Direktiven Document-Direktiven regeln Eigenschaften der Dokumentumgebung. base-uri Die Direktive base-uri schränkt die im -Element erlaubten URLs ein und verhindert so, dass Angreifer die Basis-URL für relative Links ändern. sandbox Die Direktive sandbox wendet auf die Seite Einschränkungen an, die dem sandbox-Attribut von ähneln. Sandboxed Seiten verlieren den Zugriff auf Skripte, Formulare, Pop-ups und weitere Funktionen, sofern diese nicht ausdrücklich über Sandbox-Flags wieder aktiviert werden. Navigation-Direktiven Navigation-Direktiven steuern, wohin Benutzer und Formulare Anfragen senden. form-action Die Direktive form-action schränkt die URLs ein, die als Ziel für Formularübermittlungen akzeptiert werden. frame-ancestors Die Direktive frame-ancestors legt fest, welche übergeordneten Seiten die Seite mittels , , <object> oder <embed> einbetten dürfen (das Element <applet> wurde aus der HTML-Spezifikation entfernt). Die Angabe frame-ancestors ‘none’ ersetzt den Header X-Frame-Options: DENY. navigate-to Die Direktive navigate-to wurde vorgeschlagen, um die URLs einzuschränken, zu denen das Dokument über einen beliebigen Mechanismus navigieren darf. Diese Direktive wurde aus der Spezifikation CSP Level 3 entfernt und war nie in einem produktiven Browser verfügbar. Reporting-Direktiven Reporting-Direktiven steuern das Verhalten der Verstoßmeldungen. report-to Die Direktive report-to gibt den Namen einer Reporting-Gruppe an, die über den Header Reporting-Endpoints definiert wird. Verstoßmeldungen werden an den Endpunkt gesendet, der mit der benannten Gruppe verknüpft ist. report-uri Die Direktive report-uri sendet Verstoßmeldungen an eine angegebene URL. Diese Direktive wird durch report-to abgelöst, ist aus Gründen der Abwärtskompatibilität aber nach wie vor weit verbreitet. upgrade-insecure-requests Die Direktive upgrade-insecure-requests weist den Browser an, alle HTTP-URLs auf der Seite als HTTPS zu behandeln. Das ist während der Migration von HTTP zu HTTPS wertvoll, wenn viele Ressourcen noch auf unsichere URLs verweisen. require-trusted-types-for Die Direktive require-trusted-types-for erzwingt Trusted-Types-Richtlinien für DOM-XSS-Injection-Senken und verlangt typisierte Objekte anstelle von Zeichenketten. trusted-types Die Direktive trusted-types gibt eine Erlaubnisliste von Trusted-Types-Richtliniennamen an und schränkt damit ein, welche Richtlinien die Seite erstellen darf. Quellwerte Direktiven akzeptieren Quellausdrücke, die festlegen, von wo Ressourcen geladen werden. ‘self’ Trifft auf den aktuellen Origin zu (gleiches Schema, gleicher Host, gleicher Port). Subdomains sind nicht eingeschlossen. ‘none’ Blockiert alle Quellen für die Direktive. Es werden keinerlei Ressourcen des angegebenen Typs geladen. ‘unsafe-inline’ Erlaubt Inline- ‘unsafe-eval’ Erlaubt die dynamische Code-Auswertung über eval(), Function() und ähnliche Konstrukte. ‘unsafe-hashes’ Erlaubt bestimmte Inline-Event-Handler, die über ihren Hash identifiziert werden, ohne sämtliche Inline-Skripte freizugeben. ‘strict-dynamic’ Erweitert das Vertrauen auf Skripte, die von einem bereits vertrauenswürdigen Skript geladen werden. In Kombination mit Nonce-basierten Richtlinien entfällt damit die Notwendigkeit, jeden Skript-Host einzeln auf die Erlaubnisliste zu setzen. ‘nonce-*’ Eine kryptografische Nonce (number used once), die der Server für jede Antwort erzeugt. Der Nonce-Wert in der Richtlinie stimmt mit dem nonce-Attribut an Content-Security-Policy: script-src 'nonce-abc123' ‘sha256-’, ‘sha384-’, ‘sha512-*’ Ein Hash des Inhalts des Inline-Skripts oder -Styles. Der Browser berechnet den Hash jedes Inline-Blocks und vergleicht das Ergebnis mit den auf der Erlaubnisliste stehenden Hashes. host-source Ein Host- oder URL-Muster, das erlaubte Origins angibt. Unterstützt Platzhalter für Subdomains (*.example.re), bestimmte Ports (example.re:443) und Pfadpräfixe (example.re/scripts/). scheme-source Ein Schema wie https: oder data:, das alle über das genannte Protokoll ausgelieferten Ressourcen erlaubt. ‘report-sample’ Das Schlüsselwort ‘report-sample’, einem script-src- oder style-src-Wert hinzugefügt, fordert den Browser auf, einen kurzen Ausschnitt des verstoßenden Codes in die Verstoßmeldung aufzunehmen. Das hilft dabei, das betreffende Inline-Skript oder den betreffenden Inline-Style zu lokalisieren. Beispiel Eine restriktive Richtlinie, die Ressourcen nur vom gleichen Origin zulässt, blockiert alle Inline-Skripte und das Laden externer Ressourcen. Content-Security-Policy: default-src 'self' Eine Richtlinie mit getrennten Regeln für Skripte und Bilder. Skripte werden ausschließlich vom gleichen Origin geladen, Bilder zusätzlich von einem dedizierten Bild-CDN. Content-Security-Policy: default-src 'self'; img-src 'self' images.example.re Eine Nonce-basierte Richtlinie für Skripte. Bei jedem Seitenaufruf wird eine neue Nonce erzeugt, und nur Content-Security-Policy: script-src 'nonce-r4nd0m'; style-src 'self' Eine Richtlinie, die ‘strict-dynamic’ mit einer Nonce kombiniert. Vertrauenswürdige Skripte dürfen ohne einzelne hostbasierte Erlaubnislisteneinträge weitere Skripte laden. Content-Security-Policy: script-src 'strict-dynamic' 'nonce-r4nd0m' Eine Richtlinie, die Verstöße zur Überwachung an einen Endpunkt meldet und die Regeln zugleich durchsetzt. Content-Security-Policy: default-src 'self'; report-to csp-violations Fehlersuche CSP-Verstöße erscheinen in der Browser-Konsole als “Refused to…”-Meldungen mit der URI der blockierten Ressource und der Direktive, die die Blockade verursacht hat. Inline-Skripte werden nach dem Hinzufügen von CSP blockiert. Der Browser protokolliert Refused to execute inline script because it violates the following Content Security Policy directive: “script-src …”. Die Standardrichtlinie blockiert alle Inline- Inline-Styles werden blockiert. Die Konsole zeigt Refused to apply inline style, wenn style-src weder ‘unsafe-inline’ noch eine passende Nonce bzw. einen passenden Hash enthält. Frameworks, die Styles zur Laufzeit einfügen, lösen diesen Verstoß aus. Fügen Sie style-src eine Nonce hinzu oder verwenden Sie ‘unsafe-inline’, solange die Umstellung auf Nonce-basierte Styles läuft. Eine externe Ressource wird blockiert, weil die Domain in der Direktive fehlt. Ein Fehler Refused to load the script oder Refused to connect bedeutet, dass der Origin der Ressource nicht in der betreffenden Direktive aufgeführt ist. Öffnen Sie die Browser-Konsole, ermitteln Sie den blockierten Origin anhand der Verstoßmeldung und tragen Sie ihn in die richtige Direktive ein (script-src, img-src, connect-src usw.). Prüfen Sie auch default-src, da fehlende Direktiven auf den Standardwert zurückfallen. eval() ist standardmäßig blockiert. Bibliotheken, die auf eval(), new Function() oder Template-Compiler setzen, lösen Refused to evaluate a string as JavaScript aus. Das Hinzufügen von ‘unsafe-eval’ zu script-src stellt die Funktionalität wieder her, schwächt aber die Richtlinie. Refaktorieren Sie den Code nach Möglichkeit so, dass eval() vermieden wird. Google Tag Manager oder Analytics-Skripte funktionieren unter CSP nicht mehr. Tag-Manager fügen Skripte dynamisch ein, und jedes eingefügte Skript benötigt entweder eine Nonce oder einen Eintrag in der Host-Erlaubnisliste. Fügen Sie die GTM-Domain (https://www.googletagmanager.com) zu script-src hinzu sowie https://www.google-analytics.com zu connect-src und img-src. Verwenden Sie bei Nonce-basierten Richtlinien ‘strict-dynamic’, damit Skripte, die von einem vertrauenswürdigen GTM-Skript geladen werden, das Vertrauen ohne einzelne Host-Einträge erben. Verstöße in der Browser-Konsole debuggen. Öffnen Sie die DevTools und prüfen Sie den Tab Console auf CSP-Verstoßmeldungen. Jede Meldung nennt die blockierte URI, die verletzte Direktive und die vollständige Richtlinie. In Chrome kennzeichnet der Tab Network blockierte Anfragen mit dem Status (blocked:csp). Firefox bietet vergleichbare Details sowohl im Console- als auch im Network-Panel. Eine Richtlinie gefahrlos mit dem Report-Only-Modus testen. Rollen Sie die Richtlinie zunächst über den Header Content-Security-Policy-Report-Only aus. Dieser protokolliert Verstöße, ohne Ressourcen zu blockieren. Beobachten Sie die Verstoßmeldungen, ergänzen Sie fehlende Quellen und wechseln Sie zum durchsetzenden Header Content-Security-Policy, sobald der Meldungsstrom sauber ist.