Reduzieren Sie die DOM XSS-Angriffsfläche Ihrer Anwendung.
Gesichert und geladen
Warum sollte es dich interessieren?
La secuencia de comandos de sitios cruzados basada en DOM (DOM XSS) es una de las vulnerabilidades de seguridad Netz más comunes, y es muy fácil introducirla en su aplicación. Vertrauensarten
Brindarle las herramientas para escribir, revisar la seguridad y mantener aplicaciones libres de vulnerabilidades DOM XSS al hacer que las peligrosas funciones de la API web sean seguras de manera predeterminada. Los tipos de confianza son compatibles con Chrome 83 y Polyfüllung está disponible para otros Browser. Sehen Browser-Kompatibilität Aktuelle Informationen zur browserübergreifenden Kompatibilität.
Schlüsselbegriff:
Las secuencias de comandos entre sitios basadas en DOM ocurren cuando los datos de un Nutzername controlan
Quelle (como el nombre de usuario o la Url de redireccionamiento tomada del fragmento de URL) alcanza un sinken, das ist eine Funktion wie eval ()
oder ein Immobilienersteller wie
.innerHTML
, que puede ejecutar código JavaScript arbitrario.
Hintergrund
Für viele Jahre DOM XSS
Es war eine der häufigsten und gefährlichsten Sicherheitslücken im Internet.
Hay dos grupos distintos de secuencias de comandos entre sitios. Algunas vulnerabilidades XSS son causadas por el código del lado del Server que crea de manera insegura el código HTML que forma el sitio web. Otros tienen una causa raíz en el Klient, donde el código JavaScript llama a funciones peligrosas con Inhalt controlado por el usuario.
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.
Ahora, un Browser también puede ayudar a prevenir los XSS del lado del cliente (también conocidos como basados en DOM) con 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:
Unterlassen Sie
anElement.innerHTML = location.href;
Wenn Trusted Types aktiviert ist, startet der Browser a Tippfehler und vermeiden Sie die Verwendung einer DOM XSS-Senke mit einer Zeichenfolge.
Erstellen Sie ein spezielles Objekt, einen Vertrauensstellungstyp, um anzuzeigen, dass die Daten sicher verarbeitet wurden.
Machen
anElement.innerHTML = aTrustedHTML;
Bei aktivierten Vertrauensarten akzeptiert der Browser a TrustedHTML
Objekt für Listener, die HTML-Snippets erwarten. Es gibt auch TrustedScript
y TrustedScriptURL
Objekte für andere empfindliche Waschbecken.
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
Puede implementar un recopilador de informes (como el de Open Source go-csp-Sammler) oder verwenden Sie eines der kommerziellen Äquivalente. Sie können Verstöße auch im Browser debuggen:
Fenster.addEventListener('securitypolicyviolation',
console.Error.bind(console));
Agregue el siguiente encabezado de respuesta HTTP a los documentos que desea migrar a tipos de confianza.
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
Was HTTPS y 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",
"violated-directive": "require-trusted-types-for",
"disposition": "report",
"blocked-uri": "trusted-types-sink",
"line-number": 39,
"column-number": 12,
"source-file": "https://my.url.example/script.js",
"status-code": 0,
"script-sample": "Element innerHTML <img src=x"
}
}
Das sagt das in https://my.url.example/script.js
in Zeile 39 innerHTML
wurde mit der Zeichenfolge aufgerufen, die mit beginnt <img src=x
. 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
¿Quizás la funcionalidad no conforme ya no Sein necesaria o se pueda reescribir de una manera moderna sin usar las funciones propensas a errores?
Unterlassen Sie
er.innerHTML = '<img src=xyz.jpg>';
Machen
er.textContent = '';
const img = Dokument.createElement('img');
img.src = 'xyz.jpg';
er.appendChild(img);
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.
importieren DOMPurify desde 'dompurify';
er.innerHTML = DOMPurify.sanitize(html, {RETURN_TRUSTED_TYPE: wahr);
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:
wenn (Fenster.trustedTypes && trustedTypes.createPolicy) {
const escapeHTMLPolicy = trustedTypes.createPolicy('myEscapePolicy', {
createHTML: string => string.replace(/</g, '<')
});
}
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 escaped = escapeHTMLPolicy.createHTML('<img src=x onerror=alert(1)>');
console.Log(escaped instanceof TrustedHTML);
er.innerHTML = escaped;
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:
wenn (Fenster.trustedTypes && trustedTypes.createPolicy) {
trustedTypes.createPolicy('default', {
createHTML: (string, sink) => DOMPurify.sanitize(string, {RETURN_TRUSTED_TYPE: wahr});
});
}
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