Reduzieren Sie die DOM XSS-Angriffsfläche Ihrer Anwendung.
Gesichert und geladen
Warum sollte es dich interessieren?
DOM-basiertes Cross-Site-Scripting (DOM XSS) ist eine der häufigsten Sicherheitslücken im Web und lässt sich sehr einfach in Ihre Anwendung einführen. Vertrauensarten
Sie erhalten die Tools zum Schreiben, Überprüfen der Sicherheit und zum Freihalten von Anwendungen von DOM XSS-Schwachstellen, indem gefährliche Web-API-Funktionen standardmäßig sicher gemacht werden. Vertrauensarten sind mit Chrome 83 und kompatibel Polyfüllung Es ist für andere Browser verfügbar. Sehen Browser-Kompatibilität Aktuelle Informationen zur browserübergreifenden Kompatibilität.
Schlüsselbegriff:
DOM-basiertes Cross-Site-Scripting tritt auf, wenn die Daten eines Benutzers gesteuert werden
Quelle (wie Benutzername oder Weiterleitungs-URL aus dem URL-Snippet) erreicht a sinken, das ist eine Funktion wie eval ()
oder ein Immobilienersteller wie
.innerHTML
, die beliebigen JavaScript-Code ausführen können.
Hintergrund
Für viele Jahre DOM XSS
Es war eine der häufigsten und gefährlichsten Sicherheitslücken im Internet.
Es gibt zwei unterschiedliche Gruppen von Cross-Site-Scripting. Einige XSS-Schwachstellen werden durch serverseitigen Code verursacht, der den HTML-Code, aus dem die Website besteht, unsicher erstellt. Andere haben eine Grundursache im Client, wo der JavaScript-Code gefährliche Funktionen mit benutzergesteuerten Inhalten aufruft.
ZU Vermeiden Sie serverseitiges XSSBitte generieren Sie kein HTML durch Verkettung von Zeichenfolgen und verwenden Sie sichere Vorlagenbibliotheken mit kontextbezogener automatischer Escape-Funktion. Benutze einen Nonce-basierte Inhaltssicherheitsrichtlinie zur zusätzlichen Minderung von Fehlern, die unvermeidlich auftreten.
Jetzt kann ein Browser auch dazu beitragen, clientseitiges XSS (auch bekannt als DOM-basiert) mit zu verhindern Vertrauensarten.
Einführung in die API
Vertrauensarten blockieren die folgenden Funktionen der Risikosenke. Möglicherweise erkennen Sie bereits einige davon, z. B. Browser-Anbieter und Webframes distanziert Sie bereits aus Sicherheitsgründen von der Verwendung dieser Funktionen.
-
Skriptmanipulation:
und konfigurieren Sie den Textinhalt von
Elemente.
-
HTML aus einer Zeichenfolge generieren:
innerHTML
,OuterHTML
,insertAdjacentHTML
,
,
document.write
,document.writeln
yDOMParser.parseFromString
-
Kompilieren von JavaScript-Code zur Laufzeit:
eval
,setTimeout
,setInterval
,neue Funktion ()
Für Vertrauensarten müssen Sie die Daten verarbeiten, bevor Sie sie an die oben genannten Empfängerfunktionen übergeben. Die Verwendung einer Zeichenfolge schlägt fehl, da der Browser nicht weiß, ob die Daten vertrauenswürdig sind:
Erstellen Sie ein spezielles Objekt, einen Vertrauensstellungstyp, um anzuzeigen, dass die Daten sicher verarbeitet wurden.
Vertrauensarten reduzieren das DOM XSS erheblich Angriffsfläche
Ihrer Bewerbung. Es vereinfacht Sicherheitsüberprüfungen und ermöglicht es Ihnen, typbasierte Sicherheitsüberprüfungen zu erzwingen, die beim Kompilieren, Verknüpfen oder Packen Ihres Codes zur Laufzeit im Browser durchgeführt werden.
Verwendung von Vertrauensarten
Bereiten Sie Berichte zu Verstößen gegen Richtlinien zur Inhaltssicherheit vor
Sie können einen Berichtssammler (z. B. den Open Source-Kollektor) implementieren go-csp-Sammler) oder verwenden Sie eines der kommerziellen Äquivalente. Sie können Verstöße auch im Browser debuggen:
Fenster . addEventListener ( 'securitypolicyviolation' ,
Konsole . Fehler . binden ( Konsole ) ) ;
Fügen Sie den Dokumenten, die Sie auf vertrauenswürdige Typen migrieren möchten, den folgenden HTTP-Antwortheader hinzu.
Content-Security-Policy-Only-Report: Erforderliche vertrauenswürdige Typen für 'Skript'; report-uri //my-csp-endpoint.example
Jetzt werden alle Verstöße gemeldet //my-csp-endpoint.example
, aber die Website funktioniert noch. Im nächsten Abschnitt wird erklärt, wie //my-csp-endpoint.example
Arbeitsplätze.
Vorsicht:
Vertrauensarten sind nur in verfügbar sicherer Kontext
wie HTTPS und localhost
.
Identifizieren Sie Vertrauensverletzungen
Von nun an wird ein Bericht an a gesendet, wenn vertrauenswürdige Typen einen Verstoß feststellen report-uri
. Zum Beispiel, wenn Ihre Anwendung eine Zeichenfolge an übergibt innerHTML
Der Browser sendet den folgenden Bericht:
{
"csp-report" : {
"document-uri" : "https: //my.url.example" ,
"verletzte-Direktive" : "erfordern-vertrauenswürdige-Typen-für" ,
"Disposition" : "Bericht" ,
"Blocked-Uri" : "Trusted-Types-Sink" ,
"Zeilennummer" : 39 ,
"Spaltennummer" : 12 ,
"Quelldatei" : "https: //my.url.example/script.js" ,
"Statuscode" : 0 ,
"script-sample" : "Element innerHTML
}}
}}
Das sagt das in https://my.url.example/script.js
in Zeile 39 innerHTML
wurde mit der Zeichenfolge aufgerufen, die mit beginnt . Diese Informationen sollen Ihnen dabei helfen, einzugrenzen, welche Teile Ihres Codes möglicherweise DOM XSS einführen und sich ändern sollten.
Die meisten derartigen Verstöße können auch durch Ausführen eines Code-Linter oder erkannt werden statische Codeprüfer
in Ihrer Codebasis. Dies hilft, eine große Anzahl von Verstößen schnell zu identifizieren.
Vor diesem Hintergrund sollten Sie sich auch CSP-Verstöße ansehen, die ausgelöst werden, wenn nicht konformer Code ausgeführt wird.
Beheben Sie die Verstöße
Es gibt verschiedene Möglichkeiten, um einen Verstoß gegen den Vertrauensstellungstyp zu korrigieren. Sie können den fehlerhaften Code entfernen, eine Bibliothek verwenden, eine Vertrauensrichtlinie erstellen oder als letzten Ausweg eine Standardrichtlinie erstellen.
Schreiben Sie den fehlerhaften Code neu
Möglicherweise wird die nicht konforme Funktionalität nicht mehr benötigt oder kann auf moderne Weise neu geschrieben werden, ohne die fehleranfälligen Funktionen zu verwenden?
Verwenden Sie eine Bibliothek
Einige Bibliotheken generieren bereits Vertrauensarten, die Sie an Empfängerfunktionen übergeben können. Zum Beispiel können Sie verwenden
DOMPurify um ein HTML-Snippet zu bereinigen und XSS-Nutzdaten zu entfernen.
importiere DOMPurify von 'dompurify' ;
die . innerHTML = DOMPurify . sanitize ( html , { RETURN_TRUSTED_TYPE : true ) ;
DOMPurify unterstützt Vertrauensarten und es wird bereinigtes HTML zurückgeben, das in a eingeschlossen ist TrustedHTML
Objekt, damit der Browser keine Verletzung erzeugt.
Vorsicht:
Wenn die Bereinigungslogik in DOMPurify fehlerhaft ist, weist Ihre Anwendung möglicherweise weiterhin eine DOM XSS-Sicherheitsanfälligkeit auf. Vertrauensarten zwingen Sie, einen Wert zu verarbeiten irgendwie, aber definieren Sie noch nicht, wie die genauen Verarbeitungsregeln lauten und ob sie sicher sind.
Erstellen Sie eine Vertrauensrichtlinie
Manchmal ist es nicht möglich, die Funktionalität zu entfernen, und es gibt keine Bibliothek, um den Wert zu bereinigen und einen Vertrauensstellungstyp für Sie zu erstellen. Erstellen Sie in diesen Fällen selbst ein vertrauenswürdiges Typobjekt.
Erstellen Sie dazu zunächst eine Politik. Richtlinien sind Fabriken von Vertrauensarten, die bei ihrer Eingabe bestimmte Sicherheitsregeln auferlegen:
if ( Fenster . TrustedTypes && TrustedTypes . CreatePolicy ) {
const trustHTMLPolicy = trustedTypes . createPolicy ( 'myEscapePolicy' , {
createHTML : string => string . ersetzen ( / , '<' )
} ) ;
}}
Dieser Code erstellt eine Richtlinie mit dem Namen myEscapePolicy
was kann produzieren TrustedHTML
Objekte durch ihre createHTML ()
Funktion. Definierte Regeln werden aus HTML entfernt <
Zeichen, um das Erstellen neuer HTML-Elemente zu vermeiden.
Verwenden Sie die Richtlinie wie folgt:
const entkommen = EscapeHTMLPolicy . createHTML ( ' ' ) ;
Konsole . log ( maskierte Instanz von TrustedHTML) ;
die . innerHTML = entkommen ;
Während die JavaScript-Funktion passiert ist trustTypes.createPolicy ()
Was
createHTML ()
gibt eine Zeichenfolge zurück, createPolicy ()
Gibt in diesem Fall ein Richtlinienobjekt zurück, das den Rückgabewert in einen korrekten Typ umschließt TrustedHTML
.
Verwenden Sie eine Standardrichtlinie
Manchmal kann der fehlerhafte Code nicht geändert werden. Dies ist beispielsweise der Fall, wenn Sie eine Bibliothek eines Drittanbieters von einem CDN laden. Verwenden Sie in diesem Fall a
Standardrichtlinie:
if ( Fenster . TrustedTypes && TrustedTypes . CreatePolicy ) {
vertrauenswürdige Typen . createPolicy ( 'default' , {
createHTML : ( string , sink ) => DOMPurify . sanitize ( Zeichenfolge , { RETURN_TRUSTED_TYPE : true } ) ;
} ) ;
}}
Die Richtlinie mit Namen Standard
Es wird immer dann verwendet, wenn eine Zeichenfolge in einem Empfänger verwendet wird, der nur den vertrauenswürdigen Typ akzeptiert.
Verwenden Sie die Standardrichtlinie sparsam und bevorzugen Sie es, Ihre Anwendung so umzugestalten, dass stattdessen reguläre Richtlinien verwendet werden. Auf diese Weise werden Designs gefördert, bei denen Sicherheitsregeln in der Nähe der von ihnen verarbeiteten Daten liegen und in denen Sie den meisten Kontext haben, um den Wert ordnungsgemäß zu bereinigen.
Ändern Sie diese Option, um die Inhaltssicherheitsrichtlinie durchzusetzen
Wenn Ihre Anwendung nicht mehr verletzt wird, können Sie die Vertrauensarten durchsetzen:
Inhaltssicherheitsrichtlinie: Erforderliche vertrauenswürdige Typen für 'Skript'; report-uri //my-csp-endpoint.example
Voila! Egal wie komplex Ihre Webanwendung ist, das einzige, was eine DOM XSS-Sicherheitsanfälligkeit verursachen kann, ist der Code in einer Ihrer Richtlinien, und Sie können ihn noch mehr blockieren, wenn die Politikgestaltung einschränken.
Andere Lesungen