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.