Hvordan forhindre prototypeforurensningsangrep?

Hvordan Forhindre Prototypeforurensningsangrep



Prototypeforurensningsangrepet utnytter måten JavaScript-objekter håndterer deres tilsvarende prototyper. I JavaScript er prototyper et annet objekt som definerer standardegenskapene og metodene for det valgte objektet. En angriper utnytter prototypeforurensningen ved å injisere ondsinnet kode i disse prototypene ved å manipulere objektets egenskaper eller ved å bruke en funksjon som rekursivt slår sammen objekter.

Denne veiledningen forklarer måtene å forhindre prototypeforurensningsangrep på.







Forhindre prototypeforurensningsangrep?

Grunnårsaken til prototypeforurensningsangrep er at JavaScript-objekter arver egenskaper fra prototypen. Dette betyr at hvis en angriper kan injisere ondsinnet kode i prototypen, vil den bli arvet av alle objekter som har arvet fra den prototypen. Dette fører til å stjele data, utføre vilkårlig kode eller ta kontroll over andre applikasjoner.



I kodebiten nedenfor skal prototypen for forurensningskoden injiseres:



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

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


Beskrivelsen av kodebiten ovenfor:





    • Først listen som heter ' og ” opprettes og den lagrer verdiene i nøkkelverdi-paret.
    • Med hjelp av ' -derfor- ”, implementeres den tilfeldige forurensede koden i nøkkelverdi-formatet. Nøkkelen er satt til ' defekt ' og den tilordnede verdien av ' ekte '.
    • Deretter blir denne forurensede koden tildelt ' og '-listen ved å påkalle ' tildele() '-metoden, og den resulterende listen lagres i en ny liste kalt ' c '.
    • Til slutt, den injiserte forurensede koden i ' c ”-listen hentes og verdien vises over konsollen. For å sikre at forurensning eller ondsinnede data har blitt injisert.

Etter å ha kjørt den inneholdende filen, viser utdataene at den skadelige koden har blitt injisert og verdien er hentet:



Hvordan forhindre prototypeforurensningsangrep?

Det er flere tilnærminger som kan forhindre prototypeforurensningsangrepet:

Usikre rekursive sammenslåinger:

Unngå de usikre rekursive sammenslåingene fordi de kan føre til prototypeforurensningsangrep:

hvor flette = ( tar , src ) = > {
til ( var attributter i src ) {
hvis ( type ( tar [ attributter ] ) === 'obj' && type ( src [ attributter ] ) === 'obj' )
{
slå sammen ( tar [ attributter ] , src [ attributter ] ) ;
} ellers {
tar [ attributter ] = src [ attributter ] ;
}
}
komme tilbake tar ;
} ;


I koden ovenfor:

    • Først den tilpassede funksjonen ' slå sammen() ' er opprettet som aksepterer to matriseparametere ' tar ' og ' src '.
    • Den forbedrede ' til ' loop brukes til å iterere variabelen ' attributter ' over det oppgitte ' src ' parameter.
    • Inne i løkken, bruk en ' hvis ”-setning som navigerer gjennom begge feilene og om et element som ligger i begge arrayene har samme datatype. Deretter sendes disse elementene som parametere til samme ' slå sammen() ” funksjon som skaper en rekursiv natur.
    • Hvis typene ikke er de samme, vil elementverdien som ligger i ' src ' parameter array sendes til ' tar ' parameter.
    • Til slutt, ' tar ” parametrisk matrise returneres.

Fryser prototypen

En annen forebygging for prototypeforurensningsangrep er å fryse utførelsessyklusen. Dette gjøres via ' Object.freeze() 'metoden. I utdraget nedenfor vil den over injiserte prototype forurensede koden fryses:

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

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

console.log ( Objekt.frys ( c.feil ) ) ;
console.log ( Objekt.erFryst ( c.feil ) ) ;


Forklaringen av koden ovenfor er vist nedenfor:

    • I utgangspunktet vil dummy-prototype forurenset kode bli injisert i dummy-listen ' og ' akkurat som forklart i avsnittet ovenfor.
    • Deretter, den injiserte forurensede nøkkelen ' defekt ' sendes til ' fryse() ” metode for å fryse den forurensede delen.
    • Til slutt, for å bekrefte den frosne prototypen forurensningsdelen. « defekt ' nøkkelen til listen ' c ' sendes til ' er frossen() 'metoden. Denne metoden returnerer ' ekte ' i tilfelle frossen og ' falsk ' i tilfelle ufrosset:

Etter å ha utført den inneholdende koden, viser utdataene at injeksjon, frysing og verifisering av frossen forurenset kode:


Ytterligere tips for å forhindre prototypeforurensningsangrep

Noen ekstra tips som kan brukes til å forhindre prototypeforurensningsangrep, er angitt nedenfor:

    • Alternativet til ' –deaktiver-proto ' kan brukes til å deaktivere eller drepe funksjonen til ' prototype.__proto__ ' eiendom.
    • Ikke bruk metoder ved hjelp av ' prototype '.
    • Av ' Rengjøring av brukerinndata ” som involverer validering og filtrering av brukerinndata for å fjerne eventuell ondsinnet eller forurenset kode.
    • Bruken av ' hviteliste ”, som er en liste over tillatte egenskaper og metoder for et objekt. Alle forsøk på å angi eller hente egenskaper eller metoder som ikke er medlem av hvitelisten vil bli blokkert.

Det handler om forebygging av prototypeforurensningsangrep i Node.js.

Konklusjon

For å forhindre prototypeforurensningsangrep, tilnærminger som unngåelse av usikre rekursive fusjoner, frysing av prototypen og bruk av en hviteliste for å forhindre ' __derfor__ ” egenskap fra å bli satt kan brukes. Sammen med bruken av ' –deaktiver-proto alternativer, unngå bruk av Objekt.prototype ', og ' renser brukerinndata ” for forurenset kode. Denne veiledningen har illustrert forebygging av prototypeforurensningsangrep i Nodejs.