Ich erhalte eine Reihe von Fehlern in der Entwicklerkonsole:
Weigerte sich, eine Zeichenfolge auszuwerten
Die Ausführung eines Inline-Skripts wurde abgelehnt, da es gegen die folgende Richtlinie zur Inhaltssicherheitsrichtlinie verstößt
Weigerte sich, das Skript zu laden
Weigerte sich, das Stylesheet zu laden
Worum geht es hier? Wie funktioniert die Inhaltssicherheitsrichtlinie? Wie verwende ich den Content-Security-Policy
HTTP-Header?
Insbesondere, wie man ...
- ... mehrere Quellen zulassen?
- ... unterschiedliche Richtlinien verwenden?
- ... mehrere Direktiven verwenden?
- ... Ports handhaben?
- ... mit verschiedenen Protokollen umgehen?
- ...
file://
Protokoll zulassen ? - ... Inline-Stile, Skripte und Tags verwenden
<style>
und<script>
? - ... erlauben
eval()
?
Und schlussendlich:
- Was genau bedeutet
'self'
das?
Antworten:
Mit dem
Content-Security-Policy
Meta-Tag können Sie das Risiko von XSS- Angriffen verringern, indem Sie festlegen, wo Ressourcen geladen werden können, und verhindern, dass Browser Daten von anderen Orten laden. Dies macht es für einen Angreifer schwieriger, schädlichen Code in Ihre Site einzufügen.Ich schlug meinen Kopf gegen eine Mauer, um herauszufinden, warum ich nacheinander CSP-Fehler bekam, und es schien keine präzisen, klaren Anweisungen zu geben, wie das funktioniert. Hier ist mein Versuch, einige Punkte von CSP kurz zu erklären , wobei ich mich hauptsächlich auf die Dinge konzentriere, die ich schwer zu lösen fand.
Der Kürze halber werde ich nicht in jedem Beispiel das vollständige Tag schreiben. Stattdessen zeige ich nur die
content
Eigenschaft. Ein Beispiel mit der Aufschriftcontent="default-src 'self'"
bedeutet Folgendes:1. Wie erlaube ich mehrere Quellen?
Sie können Ihre Quellen nach einer Anweisung einfach als durch Leerzeichen getrennte Liste auflisten:
Beachten Sie, dass es keine anderen Anführungszeichen für Parameter als die speziellen gibt, wie z
'self'
. Außerdem steht:
nach der Direktive kein Doppelpunkt ( ). Nur die Direktive, dann eine durch Leerzeichen getrennte Liste von Parametern.Alles, was unter den angegebenen Parametern liegt, ist implizit zulässig. Das bedeutet, dass im obigen Beispiel dies gültige Quellen wären:
Diese wären jedoch nicht gültig:
2. Wie werden verschiedene Richtlinien verwendet, was tun sie jeweils?
Die häufigsten Richtlinien sind:
default-src
Die Standardrichtlinie zum Laden von Javascript, Bildern, CSS, Schriftarten, AJAX-Anforderungen usw.script-src
definiert gültige Quellen für Javascript-Dateienstyle-src
definiert gültige Quellen für CSS-Dateienimg-src
definiert gültige Quellen für Bilderconnect-src
Definiert gültige Ziele für XMLHttpRequest (AJAX), WebSockets oder EventSource. Wenn ein Verbindungsversuch zu einem Host unternommen wird, der hier nicht zulässig ist, emuliert der Browser einen400
FehlerEs gibt andere, aber diese sind diejenigen, die Sie am wahrscheinlichsten brauchen.
3. Wie verwende ich mehrere Anweisungen?
Sie definieren alle Ihre Anweisungen in einem Meta-Tag, indem Sie sie mit einem Semikolon (
;
) beenden :4. Wie gehe ich mit Ports um?
Alles außer den Standardports muss explizit zugelassen werden, indem die Portnummer oder ein Sternchen nach der zulässigen Domäne hinzugefügt wird:
Das Obige würde führen zu:
Wie bereits erwähnt, können Sie auch ein Sternchen verwenden, um alle Ports explizit zuzulassen:
5. Wie gehe ich mit verschiedenen Protokollen um?
Standardmäßig sind nur Standardprotokolle zulässig. Um beispielsweise WebSockets
ws://
zuzulassen, müssen Sie dies explizit zulassen:6. Wie erlaube ich das Dateiprotokoll
file://
?Wenn Sie versuchen, es als solches zu definieren, funktioniert es nicht. Stattdessen erlauben Sie es mit dem
filesystem
Parameter:7. Wie verwende ich Inline-Skripte und Stildefinitionen?
Sofern nicht ausdrücklich erlaubt, können Sie keine Inline-Stildefinitionen, Code in
<script>
Tags oder in Tag-Eigenschaften wie verwendenonclick
. Sie erlauben ihnen so:Sie müssen auch explizit Inline-Base64-codierte Bilder zulassen:
8. Wie erlaube ich
eval()
?Ich bin sicher, dass viele Leute sagen würden, dass Sie dies nicht tun, da "Eval ist böse" und die wahrscheinlichste Ursache für das bevorstehende Ende der Welt. Diese Leute würden sich irren. Sicher, Sie können mit eval definitiv große Lücken in die Sicherheit Ihrer Site schlagen, aber es gibt absolut gültige Anwendungsfälle. Sie müssen nur klug sein, wenn Sie es verwenden. Sie erlauben es so:
9. Was genau bedeutet
'self'
das?Sie können
'self'
localhost, lokales Dateisystem oder irgendetwas auf demselben Host meinen. Es bedeutet keines davon. Dies bedeutet, dass Quellen dasselbe Schema (Protokoll), denselben Host und denselben Port wie die Datei haben, in der die Inhaltsrichtlinie definiert ist. Bereitstellen Ihrer Site über HTTP? Dann kein https für Sie, es sei denn, Sie definieren es explizit.Ich habe
'self'
in den meisten Beispielen verwendet, da es normalerweise sinnvoll ist, es aufzunehmen, aber es ist keineswegs obligatorisch. Lass es weg, wenn du es nicht brauchst.Aber Moment mal! Kann ich es nicht einfach benutzen
content="default-src *"
und damit fertig sein?Nein. Zusätzlich zu den offensichtlichen Sicherheitslücken funktioniert dies nicht wie erwartet. Obwohl einige Dokumente behaupten, dass es alles erlaubt, stimmt das nicht. Inlining oder Auswertungen sind nicht zulässig. Um Ihre Website wirklich besonders anfällig zu machen, verwenden Sie Folgendes:
... aber ich vertraue darauf, dass du es nicht wirst.
Weiterführende Literatur:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
quelle
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
erforderlich ist, damit einige Angular-Anwendungen funktionieren.connect-src
und Pfaden: Nachgestellte Schrägstriche sind obligatorisch, wenn Sie einen ganzen Unterpfad einfügen möchten. ZB: Die Dateihttp://foo.com/files/bar.txt
wird blockiert, wenn die Quelle isthttp://foo.com/files
, aberhttp://foo.com/files/
APACHE2 MOD_HEADERS
Sie können auch Apache2 mod_headers aktivieren. Unter Fedora ist es bereits standardmäßig aktiviert. Wenn Sie Ubuntu / Debian verwenden, aktivieren Sie es wie folgt:
Unter Ubuntu / Debian können Sie Header in der Datei konfigurieren
/etc/apache2/conf-enabled/security.conf
Hinweis: Dies ist der untere Teil der Datei. Nur die letzten drei Einträge sind CSP-Einstellungen.
Der erste Parameter ist die Direktive, der zweite sind die Quellen, die auf die weiße Liste gesetzt werden sollen. Ich habe Google Analytics und einen Adserver hinzugefügt, den Sie möglicherweise haben. Außerdem habe ich festgestellt, dass Sie Aliase, z. B. www.example.com und example.com, die in Apache2 konfiguriert sind, ebenfalls zur Whitelist hinzufügen sollten.
Inline-Code wird als schädlich angesehen. Sie sollten ihn vermeiden. Kopieren Sie alle Javascripts und CSS in separate Dateien und fügen Sie sie der Whitelist hinzu.
Während Sie gerade dabei sind, können Sie sich die anderen Header-Einstellungen ansehen und mod_security installieren
Weiterführende Literatur:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
quelle
Vergessen Sie nicht, dass font-src genauso funktioniert wie alle anderen. Wenn Sie jedoch Schriftarten verwenden, die von anderen Ursprüngen geladen wurden, stellen Sie sicher, dass Sie sie dem Meta-Tag hinzufügen
quelle