It’s #FrontendFriday – Einsatz der Content Security Policy (CSP)
Die Content Security Policy (CSP) ist ein Sicherheitskonzept, um Cross-Site-Scripting-Attacken (XSS) und andere Angriffe in Browsern zu verhindern. XSS beschreibt das Einbetten eines schädlichen Codes in einen anderen vermeintlich sicheren Kontext.
Durch die CSP werden beim Ausliefern der Webseite oder Webanwendung zusätzliche Meta-Tags übermittelt, die festlegen, welche „Vorgänge“ verhindert werden sollen. So kann z.B. das Ausführen von JavaScript-Dateien oder das Einbinden von Bildern, wenn diese nicht vom selben Server oder nicht von einer bestimmten Quelle stammen, unterbunden werden. Welche Inhalte gesperrt und welche erlaubt sind, wird durch die Angabe der Content-Security-Policy und dessen Parametern definiert.
Setzen der Content-Security-Policy
Die CSP wird durch die Definition von Parametern in eine Webanwendung integriert. Je nach Art der Parameter kann die Härte der CSP festgelegt werden.
Content-Security-Policy: script-src ’self‘ → Legt fest, dass JavaScript-Dateien nur vom eigenen Server nachgeladen werden dürfen.
Content-Security-Policy: script-src ’self‘ https://apis.google.com → Legt eine Ausnahme fest, sodass nur JavaScript-Dateien des eigenen Servers sowie Inhalte von https://apis.google.com erlaubt sind.
Schleust ein Angreifer z.B. ein Tag wie <script src=“http://evil.com/evil.js“></script> ein, wird dieses Skript nicht ausgeführt, da dies keine zuverlässige Quelle für Skripte darstellt. Der Browser gibt in diesem Fall eine Fehlermeldung aus.
Das „script-src“ steht hierbei für JavaScript-Dateien und wird als Direktive bezeichnet. Diese Direktive kann, je nach Anwendungsfall, unterschiedlich gesetzt und auch kombiniert verwendet werden.
Nach der Angabe der Direktive folgen die Parameter zur Definition der erlaubten Quellen. Hier kann zum Beispiel mit einem * alles erlaubt, mit ’none‘ alles blockiert oder mit ’self‘ das Laden von eigenen Ressourcen erlaubt werden.
Browserunterstützung
Um die Browserunterstützung schon mal vorweg zu nehmen: Für die Content Security Policy muss die Browser Kompatibilität berücksichtigt werden. Eine große Herausforderung ist wie immer der Internet Explorer, für den eigentlich immer ein Sonderfall implementiert werden muss. Eine Übersicht, welche Direktiven von den Browsern unterstützt werden, gibt es hier: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP#Browser_compatibility.
Anwendung der CSP
Variante 1: <meta>-Element in HTML-Code
Durch die Angabe von <meta>-Elementen im Header des HTML-Codes kann definiert werden, wie strikt die Content Security Policy für diese Seite eingestellt werden soll.
<!doctype html> <head> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'"> <meta http-equiv="X-WebKit-CSP" content="default-src 'self'; script-src 'self'"> <title>CSP nutzende Seite</title> </head> <body> <h1>Sie sind sicher</h1> <p>Dieses Dokument wurde mit einer sehr strikt eingestellten Content Security Policy ausgeliefert.</p> </body> </html>
In diesem Beispiel ist die CSP sehr strikt definiert. Durch die Angabe von default-src ’self‘ dürfen zusätzlichen Inhalte grundsätzlich nur geladen werden, wenn diese vom eigenen Server stammen. Die Anweisung script-src ’self‘ definiert, dass nur JavaScript-Datein vom eigenen Server ausgeführt werden dürfen. Wie so häufig müssen auch hier Sonderfälle für ältere Browser und den IE eingebunden werden. Hierzu sind die Tags mit X-Content-Security-Policy (für die Unterstützung älterer Internet Explorer Versionen) und X-Webkit-CSP (für ältere Versionen von auf Webkit-Engine basierende Browser z.B. Chrome und Safari) angegeben.