Kommentar: Vorwort: Nachdem HTML5 erscheint, hat die Netzwerksicherheit weiter verbreitet. Welche Verbesserungen hat das Web zur Netzwerksicherheit vorgenommen? Wie können wir zunehmend gefährlicher Cyberbetrug und Angriffe ausgesetzt sein? Der folgende Artikel spricht über die neueste Lösung von W3C für dieses Problem. Wenn ich in Zukunft die Möglichkeit habe, werde ich HTML5-Inhalte auf XSS, P3P, homologen Richtlinien, CORs (Cross-Domain-Ressourcenfreigabe) und CSP durchführen.
Die Sicherheitspolitik des World Wide Web basiert in einer homologen Richtlinie. Beispielsweise kann Code nur auf Daten zugreifen, haben jedoch keine Zugriffsberechtigungen. Jede Quelle ist vom Rest des Netzwerks getrennt und erstellt eine sichere Sandkiste für Entwickler. Dies ist theoretisch perfekt, aber jetzt haben die Angreifer einen klugen Weg gefunden, das System zu zerstören.Dies ist XSS Cross-Site-Skriptangriff, der homologe Richtlinien durch gefälschte Inhalte und Trick-Klicks umgeht. Dies ist ein großes Problem. Wenn der Angreifer den Code erfolgreich injiziert, wird eine beträchtliche Menge an Benutzerdaten durchgesickert.
Jetzt stellen wir eine brandneue und effektive Sicherheitsverteidigungsstrategie ein, um dieses Risiko zu mildern, nämlich Content Security Policy (CSP).
Quelle Whitelist
Der Kern von XSS -Angriffen ist, dass der Browser nicht feststellen kann, ob das Skript von Dritten injiziert wird oder wirklich Teil Ihrer Bewerbung ist. Beispielsweise lädt und führt die Schaltfläche Google +1 von https://apis.google.com/js/plusone.js aus, aber wir können nicht erwarten, von den Bildern im Browser zu erkennen, ob der Code wirklich von apis.google.com oder von apis.evil.example.com stammt. Der Browser lädt unabhängig von seiner Quelle eine Seitenanforderung für einen Code herunter und führt sie aus.
CSP definiert den Header der Inhaltssicherheitspolitik, mit dem Sie eine Whitelist vertrauenswürdige Quellen erstellen können, sodass der Browser Ressourcen nur aus diesen Quellen ausführt und macht, anstatt blind alles zu vertrauen, was vom Server bereitgestellt wird. Auch wenn ein Angreifer eine Anfälligkeit für die Injektion eines Skripts finden kann, wird es nicht ausgeführt, da die Quelle nicht in der Whitelist enthalten ist.
Die obige Schaltfläche Google +1 ist ein Beispiel, da wir glauben, dass apis.google.com ebenfalls gültigen Code sowie uns selbst liefert, können wir eine Richtlinie definieren, mit der der Browser Skripte aus einer der beiden folgenden Quellen ausführen kann.
Content-Security-Policy: script-src 'self' https://apis.google.com
Ist es nicht sehr einfach? Skript-SRC kann Skriptbeanspruchungen für bestimmte Seiten kontrollieren. Auf diese Weise lädt der Browser nur Skripte aus und von dieser Seite selbst herunter.
Sobald wir diese Richtlinie definiert haben, macht der Browser einen Fehler, wenn er den injizierten Code erkennt (beachten Sie, welcher Browser es ist).
Inhaltssicherheitsrichtlinien gelten für alle gemeinsamen Ressourcen
Obwohl Skriptressourcen die offensichtlichsten Sicherheitsrisiken sind, bietet CSP auch eine Reihe von Anweisungen, mit denen Seiten das Laden verschiedener Arten von Ressourcen steuern können, z. B. die folgenden Arten:
Content-SRC: Begrenzen Sie die Art der Verbindung (z. B. xhr, Websockets und EventSource)
Schriftart-SRC: Steuert die Quelle von Netzwerkschriften. Sie können beispielsweise die Web-Schriftarten von Google über die Schriftart-Src https://themes.googleusercontent.com verwenden.
Frame-SRC: Listet die Quelle von Frames auf, die eingebettet werden können. Beispielsweise ermöglicht es in der Rahmen-SRC https://youtube.com nur Videos, die in YouTube eingebettet sind. .
IMG-SRC: Definiert die Quelle des ladbaren Bildes.
Medien-SRC: Begrenzen Sie die Quelle von Video und Audio.
Objekt-SRC: Beschränken Sie die Quelle von Blitz und anderen Plugins.
STYLE-SRC: Ähnlich wie bei Skript-SRC funktioniert es nur in der CSS-Datei.
Standardmäßig sind alle Einstellungen ohne Beschränkungen eingeschaltet. Sie können mehrere Anweisungen durch Semikolons trennen, aber ähnlich wie bei script-src https: //host1.com; script-src https://host2.com wird die zweite Anweisung ignoriert. Die richtige Möglichkeit, es zu schreiben, ist Skript-Src https://host1.com https://host2.com.
Sie haben beispielsweise eine Anwendung, die alle Ressourcen aus einem Inhaltsverteilungsnetzwerk laden muss (CDN, z.
Content-Security-Policy: Standard-Src https://cdn.example.net; Frame-src 'keine'; Objekt-Src 'Keine'
Detail
Der HTTP-Header, den ich in meinem Beispiel verwendet habe, ist die Inhalts-Security-Policy, aber moderne Browser haben bereits Unterstützung durch Präfixe geliefert: Firefox verwendet X-Content-Security-Policy, Webkit verwendet X-Webkit-CSP. In Zukunft wird es nach und nach zu einheitlichen Standards übergehen.
Die Strategie kann für jede verschiedene Seite festgelegt werden, was viel Flexibilität bietet. Da einige Seiten auf Ihrer Website möglicherweise Google +1 -Schaltflächen haben, andere nicht.
Die Quellliste jeder Anweisung kann sehr flexibel sein. Sie können ein Muster angeben (Daten:, https :), oder einen Hostnamen in einem Bereich angeben (Beispiel.com, der beliebig Quelle, einen beliebigen Modus und einen beliebigen Port auf dem Host) oder ein vollständiges URI angeben (https://example.com:443, insbesondere das HTTPS -Protokoll, Beispiel.com -Domain -Name, Port 443).
Sie können auch vier Schlüsselwörter in der Quellliste verwenden:
Keine: Sie können erwarten, dass Sie etwas nicht anpassen
Selbst: Gleich wie die aktuelle Quelle, enthält aber keine Subdomänen
Unsicherer Inline: Ermöglicht Inline JavaScript und CSS
unsicher-eval: Mechanismen, die Js Text ermöglichen, wie z. B. eval
Bitte beachten Sie, dass diese Schlüsselwörter zitiert werden müssen.
Sandkasten
Hier gibt es eine weitere Anweisung, hier zu diskutieren: Sandbox. Es ist etwas unvereinbar mit anderen Anweisungen. Es steuert hauptsächlich das auf der Seite genommene Verhalten und nicht die Ressourcen, die die Seite geladen werden kann. Wenn diese Eigenschaft festgelegt ist, verhalten sich die Seite wie ein Rahmen mit dem Sandbox -Eigenschaftssatz. Dies hat eine Vielzahl von Auswirkungen auf die Seite, z. B. die Verhinderung von Formulareinführungen usw. Dies geht ein wenig über den Rahmen dieses Artikels hinaus. Sie können jedoch weitere Informationen im Abschnitt "Sandbox -Logo -Einstellungen der HTML5 -Spezifikation" finden.
Schädlicher Inline -Code
CSP basiert auf Quellen -Whitelisten, löst jedoch nicht die größte Quelle für XSS -Angriffe: Inline -Skriptinjektion. Wenn ein Angreifer Skript -Tags injizieren kann, die einen schädlichen Code enthalten (<Script> sendMyDatoevildotcom (); </script>), hat der Browser keinen guten Mechanismus, um dieses Tag zu unterscheiden. CSP kann dieses Problem nur lösen, indem Inline -Skripte vollständig verboten sind.
Dieses Verbot enthält nicht nur Skript -Tags, die in das Skript eingebettet sind, sondern auch Inline -Event -Handler und JavasCrpt: URLs. Sie müssen den Inhalt des Skript -Tags in eine externe Datei einfügen und JavaScript ersetzen: und <a… Onclick = [JavaScript]> durch das entsprechende AddEventListener. Zum Beispiel können Sie das folgende Formular ausgeben:
<Script>
Funktion doamazinghings () {
Alarm ('du bist unglaublich!');
}
</script>
<butt> Bin ich erstaunlich? </button>
Schreiben Sie in die folgende Form:
<!-erstaunlich.html->
<script src = 'Amazing.js'> </script>
<butt> Bin ich erstaunlich? </button>
// erstaunlich.js
Funktion doamazinghings () {
Alarm ('du bist unglaublich!');
}
document.addeventListener ('domcontentray', function () {
document.getElementById ('erstaunlich')
.AddeventListener ('Click', Doamazinghings);
});
Unabhängig davon, ob Sie CSP verwenden oder nicht, hat der obige Code tatsächlich größere Vorteile. Inline JavaScript mischt Struktur und Verhalten vollständig, das sollten Sie nicht tun. Darüber hinaus sind Outreach -Ressourcen in Browsern leichter zu speichern, für Entwickler einfacher zu verstehen und einfach zu kompilieren und zu komprimieren. Wenn Sie Outreach -Code verwenden, schreiben Sie einen besseren Code.
Inline -Stile müssen auf die gleiche Weise verarbeitet werden, sowohl die Stilattribute als auch die Stil -Tags müssen in das externe Stylesheet extrahiert werden. Dies kann alle Arten von magischen Datenleckagen verhindern.
Wenn Sie Inline-Skripte und -stile haben müssen, können Sie den unsicheren Wert für das Skript-SRC- oder Style-SRC-Attribut festlegen. Aber tu das nicht. Das Verbot von Inline -Skripten ist die von CSP bereitgestellte maximale Sicherheitsgarantie. Gleichzeitig kann das Verbot von Inline -Stilen Ihre Anwendung sicherer und robuster machen. Es ist ein Kompromiss, aber es lohnt sich.
Bewerten
Auch wenn ein Angreifer das Skript nicht direkt injizieren kann, kann er Ihre Anwendung dazu veranlassen, den eingefügten Text in ein ausführbares Skript umzuwandeln und es selbst auszuführen. eval (), newfunction (), setTimeout ([String], ...) und setInterval ([String], ...) können alle so gefährliche Träger werden. Die Strategie für CSP, dieses Risiko abzuzielen, besteht darin, diese Vektoren insgesamt zu blockieren.
Dies hat einige Auswirkungen auf die Art und Weise, wie Sie Ihre App erstellen:
Analysieren Sie JSON über eingebaute JSON.Parse, ohne sich auf Eval zu verlassen. Browser nach IE8 unterstützen lokale JSON -Operationen, was völlig sicher ist.
Schreiben Sie die Anrufmethode von SetTimeout und SetInterval nach Inline -Funktionen anstelle von Zeichenfolgen neu. Zum Beispiel:
setTimeout (document.querySelector ('a'). style.display = 'none';, 10);
Kann umgeschrieben werden wie:
setTimeout (function () {document.querySelector ('a'). style.display = 'none';}, 10);
Vermeiden Sie die Inline -Vorlagen zur Laufzeit: Viele Vorlagenbibliotheken verwenden neue Funktionen (), um die Vorlagenerzeugung zu beschleunigen. Dies ist ideal für dynamische Programme, aber für böswilligen Text riskant.
Bericht
CSP kann nicht vertrauenswürdige Ressourcen auf der Serverseite blockieren, was für Benutzer sehr nützlich ist. Für uns ist es jedoch sehr nützlich, verschiedene Benachrichtigungen an den Server zu senden, damit wir alle böswilligen Skriptinjektionen identifizieren und beheben können. Zu diesem Zweck können Sie den Browser anweisen, einen Abfangbericht im JSON-Format an eine Adresse über die Berichtsanweisung zu senden.
Content-Security-Policy: Standard-Src 'Self'; ...; report-uri /my_amazing_csp_report_parser;
Der Bericht wird so aussehen:
{
CSP-Report: {
Dokument-uri:,
Referrer:,
blockiert-uri:,
SORTENT-DIRECTIVE: script-src 'self' https://apis.google.com,
Originalpolicy: script-src 'self' https://apis.google.com; Report-uri
}
}
Die darin enthaltenen Informationen helfen Ihnen dabei, die Blockierungssituation, einschließlich des auftretenden Dokuments, zu identifizieren, den Seitenverweis, die Ressource, die gegen die Seitenrichtlinie verstößt, die verletzte Richtlinie und die ursprüngliche Richtlinie aller Seiteninhalte.
Realistischer Gebrauch
CSP ist jetzt auf Chrome 16+ und Firefox 4+ -Browsern erhältlich, und es wird erwartet, dass er nur begrenzte Unterstützung für IE10 erhält. Safari wird noch nicht unterstützt, aber der Webkit -Nightly -Build ist verfügbar, sodass Safari in der folgenden Iteration unterstützt wird.
Schauen wir uns unten einige häufig verwendete Anwendungsfälle an:
Tatsächlicher Fall 1: Social -Media -Widget
Die Schaltfläche Google +1 enthält Skripte von https://apis.google.com sowie IFrames, die von https://plusone.google.com eingebettet sind. Ihre Richtlinie muss diese Quellen enthalten, um die Schaltfläche Google+1 zu verwenden. Die einfachste Strategie ist Skript-Src https://apis.google.com; Frame-Src https://plusone.google.com. Sie müssen auch sicherstellen, dass die von Google bereitgestellten JS -Fragmente in externen JS -Dateien gespeichert werden.
Es gibt viele Implementierungslösungen für die ähnliche Button von Facebook. Ich empfehle Ihnen, sich an die Iframe -Version zu halten, da sie vom Rest Ihrer Website gut isoliert bleibt. Dies erfordert die Verwendung der Rahmen-SRC https://facebook.com-Anweisung. Bitte beachten Sie, dass der von Facebook bereitgestellte Iframe -Code standardmäßig den relativen Pfad //facebook.com verwendet. Bitte ändern Sie diesen Code in https://facebook.com. Es ist nicht erforderlich, dass HTTP nicht verwendet wird.
Twitters Tweet -Schaltfläche hängt von Skript und Frame von https://platform.twitter.com ab (Twitter bietet standardmäßig eine relative URL. Bearbeiten Sie den Code, wenn Sie ihn als HTTPS angeben).
Andere Plattformen haben ähnliche Situationen und können ähnlich gelöst werden. Ich empfehle, Standard-SRC auf keine festzulegen und dann die Konsole zu überprüfen, um zu überprüfen, welche Ressourcen Sie verwenden müssen, um sicherzustellen, dass das Widget ordnungsgemäß funktioniert.
Die Verwendung mehrerer Widgets ist sehr einfach: Führen Sie einfach alle Richtlinienanweisungen zusammen und denken Sie daran, die Einstellungen derselben Richtlinie zusammenzustellen. Wenn Sie die oben genannten drei Widgets verwenden möchten, sieht die Strategie so aus:
script-src https://apis.google.com https://platform.twitter.com; Frame-src https://plusone.google.com https://facebook.com https://platform.twitter.com
Tatsächlicher Fall 2: Verteidigung
Angenommen, Sie besuchen eine Bankwebsite und möchten sicherstellen, dass nur die Ressourcen, die Sie benötigen, geladen werden. Beginnen Sie in diesem Fall mit der Einstellung einer Standardberechtigung, um alles zu blockieren (Standard-SRC 'None') und die Richtlinie von Grund auf neu erstellen.
Beispielsweise muss eine Bankwebsite Bilder, Stile und Skripte von CDN von https://cdn.mybank.net laden und eine Verbindung zu https://api.mybank.com/ über XHR herstellen, um verschiedene Daten zu ziehen. Es muss auch einen Rahmen verwenden, aber die Frames stammen alle von Nicht-Dritt-Party-lokalen Seiten. Es gibt keinen Blitz, Schriftarten und andere Inhalte auf der Website. In diesem Fall können wir den strengsten CSP -Header IS senden:
Content-Security-Policy: Standard-Src 'None'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; IMG-Src https://cdn.mybank.net; Connect-Src https://api.mybank.com; Rahmen-Src 'Selbst' '
Tatsächlicher Fall 3: Verwenden Sie nur SSL
Ein Administrator des Ehering -Forums möchte, dass alle Ressourcen auf sichere Weise geladen werden, möchte aber nicht wirklich zu viel Code schreiben. Eine große Anzahl von Inline-Skripten und -Stilen von Drittanbietern zu schreiben, liegt außerhalb seiner Fähigkeit. Die folgende Strategie wird also sehr nützlich sein:
Content-Security-Policy: Standard-Src Https:; script-src https: 'unsicher-inline'; Style-Src Https: 'Unsichere Inline'
Obwohl Standard-SRC HTTPS angibt, werden Skripte und Stile nicht automatisch geerbt. Jede Anweisung überschreibt den Standardressourcentyp vollständig.
Zukunft
Die Arbeitsgruppe Web Application Security der W3C entwickelt Details zu den Spezifikationen für Inhaltssicherheitsrichtlinien. Version 1.0 wird in die endgültige Revisionsphase eintreten, die dem in diesem Artikel beschriebenen der beschriebenen Abgaben liegt. Die Public-WebAppSec@-E-Mail-Gruppe diskutiert Version 1.1, und die Browserhersteller arbeiten auch hart daran, die Implementierung von CSP zu konsolidieren und zu verbessern.
CSP 1.1 hat einige interessante Dinge in der Kunstboote, die es wert sind, separat aufzulisten:
Hinzufügen von Richtlinien über Meta -Tags: Die bevorzugte Methode zum Festlegen von CSP sind HTTP -Header, was sehr nützlich ist, aber es wird direkter durch Tags oder Skripte, aber es wurde noch nicht abgeschlossen. Webkit hat die Funktion der Berechtigungseinstellung über Meta-Elemente implementiert, sodass Sie jetzt die folgenden Einstellungen in Chrome ausprobieren können: add <metahttp-äquiv = x-webkit-csp content = [Richtlinie geht hier]> zum Dokumentkopf.
Sie können sogar zur Laufzeit Richtlinien über Skripte hinzufügen.
DOM -API: Wenn diese Funktion zur nächsten Iteration von CSP hinzugefügt wird, können Sie die aktuelle Sicherheitsrichtlinie der Seite über JavaScript abfragen und nach verschiedenen Situationen anpassen. Wenn eval () beispielsweise verfügbar ist, kann Ihre Code -Implementierung geringfügig unterschiedlich sein. Dies ist sehr nützlich für den Autor des JS -Frameworks; Die API -Spezifikation ist immer noch sehr ungewiss. Sie können die neueste Iteration im Abschnitt Skript -Schnittstelle der Entwurfsspezifikation finden.
Neue Richtlinien: Viele neue Richtlinien werden diskutiert, einschließlich Skript-Nicht-Nonce: Inline-Skripte können nur verwendet werden, wenn die explizit angegebenen Skriptelemente verwendet werden. Plugin-Typen: Dadurch wird der Typ des Plugins eingeschränkt. Form-Action: Lassen Sie das Formular nur an eine bestimmte Quelle übermittelt.
Wenn Sie an Diskussionen über diese zukünftigen Funktionen interessiert sind, können Sie das Archiv der Mailingliste lesen oder der Mailingliste hinzufügen.
Dieser Artikel wird übersetzt:
Auszug aus: Jiang Yujies Blog