XSS-Angriffe (Cross-Site-Scripting) zählen zu den häufigsten Bedrohungen im Internet. Dabei versuchen Angreifer, unsichere Daten als vertrauenswürdig erscheinen zu lassen, um mithilfe eingeschleusten Codes Zugriff auf eine Website zu erlangen oder sensible Informationen auszuspähen. Erfahren Sie, wie Sie sich mit Content Security Policies (CSP) effektiv vor XSS-Angriffen schützen können.
Stellen Sie sich vor, Ihre Website enthält ein Eingabefeld, etwa für eine Suchfunktion. Anstatt einen Text-String einzugeben, könnte ein Nutzer ein Skript hinterlegen, beispielsweise:
<script>alert(0);</script>
Dies stellt die einfachste Form eines XSS-Angriffs dar. Wird die Alert-Box nach Betätigen der Suchfunktion angezeigt, hat die Website den Skript-Code ausgeführt. Dies bedeutet, dass der Code des Angreifers als vertrauenswürdig angesehen wurde. Mit Content Security Policies (CSP) lässt sich die Ausführung solcher Inline-Skripte verhindern.
Content Security Policies sind ein Schutzmechanismus, der das Ausführen unerwünschter Skripte unterbindet. Mithilfe von HTTP-Response-Headern können Sie festlegen, welche Ressourcen der Browser von welchen Quellen laden darf. Alles, was nicht explizit freigegeben wurde, wird blockiert. Der Browser prüft diese Regeln und verhindert viele gängige Angriffsmethoden, wie das Einbetten externer Ressourcen. So können beispielsweise JavaScript-Dateien von fremden Servern blockiert werden.
Ein einfacher CSP-Standard-Eintrag lautet:
Content-Security-Policy: default-src 'self'
Damit lädt der Browser ausschließlich Ressourcen vom selben Webserver. Externe Inhalte wie YouTube-Videos oder JavaScript-Bibliotheken werden in diesem Fall blockiert. Auch das Tracking mit Google Analytics funktioniert nicht mehr. Standardmäßig verhindert CSP die Ausführung aller Inline-Skripte.
Wird CSP mit den Standardeinstellungen aktiviert und die Website enthält Inline-Skripte, erscheint in der Browser-Konsole eine Fehlermeldung wie:
Refused to execute inline script because it violates the following Content Security Policy: "default-src 'self'".
Either the unsafe-inline keyword, a hash('sha256-7ighj4gd6sfacJptoIgk396ur'), or nonce …
is required to enable inline execution.
Das betroffene Skript wird nicht ausgeführt. Die Ausführung kann dann wie folgt erlaubt werden:
Das Schlüsselwort unsafe-inline
hebt den Schutz komplett auf, wodurch alle Skripte ausgeführt werden. Dies ist äußerst unsicher und sollte vermieden werden.
Alternativ können Sie den in der Fehlermeldung genannten SHA-256-Hash verwenden, um die CSP entsprechend zu erweitern:
Content-Security-Policy: default-src 'self'; script-src 'sha256-7ighj4gd6sfacJptoIgk396ur'
Diese Methode erlaubt ausschließlich die Ausführung des spezifischen Inline-Skripts, dessen Hash angegeben wurde und eignen sich daher besonders für statische Inline-Skripte.
Während Hashes für statische Skripte ideal sind, eignen sie sich nicht für dynamisch generierte Inhalte. Für diese Fälle kommen Nonces zum Einsatz.
Eine Nonce ist eine einmalig generierte, zufällige Nummer. Sie erlaubt einem gesamten Skript-Block die Ausführung, unabhängig von dessen Inhalt. Ein Beispiel für die Nutzung einer Nonce sieht wie folgt aus:
Content-Security-Policy: default-src 'self'; script-src 'nonce-7ighj4gd6sfacJptoIgk396ur'
<script type="text/javascript" nonce="7ighj4gd6sfacJptoIgk396ur">
Die Nonce im CSP-Header muss mit der Nonce im Skript-Tag übereinstimmen. Dies bietet mehr Flexibilität, allerdings bleibt bei dynamischem Inhalt das Risiko von Angriffen bestehen.
Mit CSP schützen Sie Ihre Website und deren Nutzer effektiv vor Angriffen.
Fehlerhafte CSP-Konfigurationen können dazu führen, dass die Website nicht wie gewünscht funktioniert.
CSP Evaluator
https://csp-evaluator.withgoogle.com
CSP Validator
https://cspvalidator.org