Wie kann man Prototypen-Verschmutzungsangriffe verhindern?

Wie Kann Man Prototypen Verschmutzungsangriffe Verhindern



Der Prototyp-Verschmutzungsangriff nutzt die Art und Weise aus, wie JavaScript-Objekte mit ihren entsprechenden Prototypen umgehen. In JavaScript sind Prototypen ein weiteres Objekt, das die Standardeigenschaften und -methoden für das ausgewählte Objekt definiert. Ein Angreifer nutzt die Prototypenverschmutzung aus, indem er schädlichen Code in diese Prototypen einschleust, indem er die Eigenschaften des Objekts manipuliert oder eine Funktion verwendet, die Objekte rekursiv zusammenführt.

In diesem Leitfaden werden die Möglichkeiten zur Verhinderung von Prototyp-Verschmutzungsangriffen erläutert.







Prototypische Verschmutzungsangriffe verhindern?

Die Hauptursache für Prototypenverschmutzungsangriffe besteht darin, dass JavaScript-Objekte Eigenschaften von ihrem Prototyp erben. Das heißt, wenn ein Angreifer bösartigen Code in den Prototyp einschleusen kann, wird dieser von allen Objekten geerbt, die von diesem Prototyp geerbt haben. Dies führt dazu, dass Daten gestohlen werden, willkürlicher Code ausgeführt wird oder die Kontrolle über andere Anwendungen übernommen wird.



Im folgenden Codeausschnitt wird der Prototyp-Verschmutzungscode eingefügt:



const y = { A: 1 , B: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'faulty': true}}' ) ;

const c = Object.assign ( { } , und, Daten ) ;
console.log ( c.fehlerhaft ) ;


Die Beschreibung des obigen Codeausschnitts:





    • Zuerst die Liste mit dem Namen „ Und „wird erstellt und speichert die Werte im Schlüssel-Wert-Paar.
    • Mit der Hilfe von ' -daher- “, wird der zufällig verschmutzte Code im Schlüsselwertformat implementiert. Der Schlüssel ist auf „ Defekt ” und der zugewiesene Wert von „ WAHR “.
    • Dann wird dieser verschmutzte Code dem „ Und ”-Liste durch Aufrufen der Funktion „ zuordnen() ”-Methode, und die resultierende Liste wird in einer neuen Liste mit dem Namen „ C “.
    • Schließlich wurde der verschmutzte Code in die „ C Die Liste wird abgerufen und ihr Wert wird über der Konsole angezeigt. Um sicherzustellen, dass Verschmutzungen oder schädliche Daten eingeschleust wurden.

Nach der Ausführung der enthaltenden Datei zeigt die Ausgabe, dass der Schadcode erfolgreich eingeschleust und sein Wert abgerufen wurde:



Wie kann man Prototypen-Verschmutzungsangriffe verhindern?

Es gibt mehrere Ansätze, mit denen der prototypische Verschmutzungsangriff verhindert werden kann:

Unsichere rekursive Zusammenführungen:

Vermeiden Sie unsichere rekursive Zusammenführungen, da diese zu Prototypenverschmutzungsangriffen führen können:

wo verschmelzen = ( dauert , src ) = > {
für ( var-Attribute In src ) {
Wenn ( Art der ( dauert [ Attribute ] ) === „obj“ && Art der ( src [ Attribute ] ) === „obj“ )
{
verschmelzen ( dauert [ Attribute ] , src [ Attribute ] ) ;
} anders {
dauert [ Attribute ] = src [ Attribute ] ;
}
}
zurückkehren dauert ;
} ;


Im obigen Code:

    • Erstens die benutzerdefinierte Funktion „ verschmelzen() ” wird erstellt, das zwei Array-Parameter akzeptiert „ dauert ' Und ' src “.
    • Die verbesserte „ für „Schleife wird verwendet, um die Variable zu iterieren“ Attribute ” über das bereitgestellte „ src ” Parameter.
    • Verwenden Sie innerhalb der Schleife ein „ Wenn ”-Anweisung, die durch beide Fehler navigiert und prüft, ob ein Element in beiden Arrays denselben Datentyp hat. Dann werden diese Elemente als Parameter an dasselbe übergeben „ verschmelzen() ”Funktion, die einen rekursiven Charakter erzeugt.
    • Wenn die Typen nicht identisch sind, wird der Elementwert im „ src „Parameter-Array wird an „ übergeben dauert ” Parameter.
    • Endlich, das ' dauert „Ein parametrisches Array wird zurückgegeben.

Einfrieren des Prototyps

Eine weitere Vorbeugung gegen Prototyp-Verschmutzungsangriffe besteht darin, ihren Ausführungszyklus einzufrieren. Dies geschieht über die „ Object.freeze() ' Methode. Im folgenden Snippet wird der oben injizierte verunreinigte Code-Prototyp eingefroren:

const y = { A: 1 , B: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'faulty': true}}' ) ;

const c = Object.assign ( { } , und, Daten ) ;
console.log ( c.fehlerhaft ) ;

console.log ( Object.freeze ( c.fehlerhaft ) ) ;
console.log ( Object.isFrozen ( c.fehlerhaft ) ) ;


Die Erklärung des obigen Codes ist unten dargestellt:

    • Zunächst wird verunreinigter Dummy-Prototyp-Code in die Dummy-Liste eingefügt. Und ” genau wie im obigen Abschnitt erklärt.
    • Dann wird der verschmutzte Schlüssel eingespritzt“ Defekt „wird an „übergeben“ einfrieren() ”-Methode zum Einfrieren des verschmutzten Teils.
    • Abschließend muss noch der gefrorene Prototyp-Verschmutzungsteil bestätigt werden. Der ' Defekt „Schlüssel der Liste“ C „wird an „übergeben“ ist gefroren() ' Methode. Diese Methode gibt „ WAHR ” im Falle von Einfrieren und „ FALSCH ” im Falle des Auftauens:

Nach der Ausführung des enthaltenden Codes zeigt die Ausgabe, dass die Injektion, das Einfrieren und die Überprüfung des eingefrorenen verunreinigten Codes:


Zusätzliche Tipps zur Verhinderung von Verschmutzungsangriffen durch Prototypen

Nachfolgend finden Sie einige zusätzliche Tipps, mit denen der Prototyp-Verschmutzungsangriff verhindert werden kann:

    • Die Option „ –disable-proto ” kann verwendet werden, um die Funktion des „ zu deaktivieren oder zu beenden. Prototyp.__proto__ ' Eigentum.
    • Verwenden Sie keine Methoden mit Hilfe von „ Prototyp “.
    • Von ' Bereinigen der Benutzereingaben ” Dazu gehört die Validierung und Filterung von Benutzereingaben, um bösartigen oder verunreinigten Code zu entfernen.
    • Gebrauch von ' Whitelist “, bei dem es sich um eine Liste zulässiger Eigenschaften und Methoden für ein Objekt handelt. Alle Versuche, Eigenschaften oder Methoden festzulegen oder abzurufen, die nicht zur Whitelist gehören, werden blockiert.

Dabei geht es um die Verhinderung von Prototyp-Verschmutzungsangriffen in Node.js.

Abschluss

Um Angriffe durch Prototypenverschmutzung zu verhindern, sind Ansätze wie die Vermeidung unsicherer rekursiver Zusammenführungen, das Einfrieren des Prototyps und die Verwendung einer Whitelist zur Verhinderung des „Prototyps“ erforderlich. __daher__ Die festgelegte Eigenschaft „“ kann verwendet werden. Zusammen mit der Nutzung von „ –disable-proto ”-Optionen, wobei die Verwendung von „ vermieden wird Objekt.Prototyp ', Und ' Bereinigen der Benutzereingaben ” für verschmutzten Code. Dieser Leitfaden hat die Verhinderung von Prototyp-Verschmutzungsangriffen in Nodejs veranschaulicht.