Hvordan forebygger man prototypeforureningsangreb?

Hvordan Forebygger Man Prototypeforureningsangreb



Prototypeforureningsangrebet udnytter den måde, JavaScript-objekter håndterer deres tilsvarende prototyper på. I JavaScript er prototyper et andet objekt, der definerer standardegenskaberne og -metoderne for det valgte objekt. En angriber udnytter prototypeforureningen ved at injicere ondsindet kode i disse prototyper ved at manipulere objektets egenskaber eller ved at bruge en funktion, der rekursivt flette objekter.

Denne vejledning forklarer måderne til at forhindre prototypeforureningsangreb.







Forhindre prototypeforureningsangreb?

Grundårsagen til prototypeforureningsangreb er, at JavaScript-objekter arver egenskaber fra deres prototype. Det betyder, at hvis en angriber kan injicere ondsindet kode i prototypen, vil den blive nedarvet af alle objekter, der har arvet fra den pågældende prototype. Dette fører til at stjæle data, udføre vilkårlig kode eller tage kontrol over andre applikationer.



I nedenstående kodestykke vil prototypen af ​​forureningskoden blive injiceret:



const y = { en: 1 , b: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'defekt': sand}}' ) ;

const c = Object.assign ( { } og data ) ;
console.log ( c.defekt ) ;


Beskrivelsen af ​​ovenstående kodestykke:





    • Først listen med navnet ' og ” oprettes, og den gemmer værdierne i nøgleværdi-parret.
    • Med hjælp fra ' -derfor- ”, implementeres den tilfældige forurenede kode i nøgleværdi-formatet. Nøglen er sat til ' defekt ' og den tildelte værdi af ' rigtigt '.
    • Derefter tildeles denne forurenede kode til ' og ' liste ved at påkalde ' tildele() '-metoden, og den resulterende liste gemmes i en ny liste med navnet ' c '.
    • Endelig er den injicerede forurenede kode i ' c ”-listen hentes, og dens værdi vises over konsollen. For at sikre, at forurening eller ondsindede data er blevet injiceret.

Efter at have udført den indeholdende fil, viser outputtet, at den skadelige kode er blevet injiceret med succes, og dens værdi er blevet hentet:



Hvordan forebygger man prototypeforureningsangreb?

Der er flere tilgange, hvorved prototypeforureningsangrebet kan forhindres:

Usikre rekursive fletninger:

Undgå de usikre rekursive fusioner, fordi de kan føre til prototypeforureningsangreb:

hvor flette = ( tager , src ) = > {
til ( var attributter i src ) {
hvis ( type ( tager [ egenskaber ] ) === 'obj' && type ( src [ egenskaber ] ) === 'obj' )
{
fusionere ( tager [ egenskaber ] , src [ egenskaber ] ) ;
} andet {
tager [ egenskaber ] = src [ egenskaber ] ;
}
}
Vend tilbage tager ;
} ;


I ovenstående kode:

    • Først den brugerdefinerede funktion ' fusionere() ' er oprettet, der accepterer to array-parametre ' tager ' og ' src '.
    • Den forbedrede ' til ' loop bruges til at iterere variablen ' egenskaber ' over den angivne ' src ' parameter.
    • Inde i løkken skal du bruge en ' hvis ”-sætning, der navigerer gennem begge fejl, og hvis et element, der findes i begge arrays, har samme datatype. Derefter sendes disse elementer som parametre til den samme ' fusionere() ” funktion, der skaber en rekursiv natur.
    • Hvis typerne ikke er de samme, vil elementværdien, der ligger i ' src ' parameter array sendes til ' tager ' parameter.
    • Endelig er ' tager ” parametrisk array bliver returneret.

Frysning af prototypen

En anden forebyggelse af prototyper af forureningsangreb er at fastfryse deres udførelsescyklus. Dette gøres via ' Object.freeze() ” metode. I nedenstående uddrag vil den ovenfor injicerede prototype forurenede kode blive frosset:

const y = { en: 1 , b: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'defekt': sand}}' ) ;

const c = Object.assign ( { } og data ) ;
console.log ( c.defekt ) ;

console.log ( Objekt.frys ( c.defekt ) ) ;
console.log ( Objekt.er Frosset ( c.defekt ) ) ;


Forklaringen af ​​ovenstående kode er vist nedenfor:

    • I første omgang vil dummy-prototype-forurenet kode blive injiceret i dummy-listen ' og ” præcis som forklaret i ovenstående afsnit.
    • Derefter, den indsprøjtede forurenede nøgle ' defekt ' videregives til ' fryse() ” metode til at fryse den forurenede del.
    • Endelig for at bekræfte den frosne prototypeforureningsdel. Det ' defekt 'nøgle på listen' c ' videregives til ' er frosset() ” metode. Denne metode returnerer ' rigtigt ' i tilfælde af frosne og ' falsk ” i tilfælde af ufrosset:

Efter at have udført den indeholdende kode, viser outputtet, at injektion, frysning og verifikation af frossen forurenet kode:


Yderligere tips til at forhindre prototypeforureningsangreb

Nogle yderligere tips, som prototypen af ​​forureningsangrebet kan forhindres, er angivet nedenfor:

    • Muligheden for ' –deaktiver-proto ' kan bruges til at deaktivere eller dræbe driften af ​​' prototype.__proto__ ” ejendom.
    • Brug ikke metoder ved hjælp af ' prototype '.
    • Ved ' Rengøring af brugerinput ” som involverer validering og filtrering af brugerinput for at fjerne enhver ondsindet eller forurenet kode.
    • Anvendelse af ' hvidliste ”, som er en liste over tilladte egenskaber og metoder for et objekt. Ethvert forsøg på at indstille eller hente egenskaber eller metoder, der ikke er medlem af hvidlisten, vil blive blokeret.

Det handler alt sammen om forebyggelse af prototypeforureningsangreb i Node.js.

Konklusion

For at forhindre prototypeforureningsangreb, tilgange som undgåelse af usikre rekursive fusioner, frysning af prototypen og brug af en hvidliste for at forhindre ' __derfor__ ” egenskab fra at blive sat kan bruges. Sammen med brugen af ​​' –deaktiver-proto ' muligheder, undgå brugen af ​​' Objekt.prototype ', og ' renser brugerinputtet ” for forurenet kode. Denne guide har illustreret forebyggelsen af ​​prototypeforureningsangreb i Nodejs.