Kuinka estää prototyyppien saastehyökkäykset?

Kuinka Estaa Prototyyppien Saastehyokkaykset



Prototyyppisaastehyökkäys hyödyntää tapaa, jolla JavaScript-objektit käsittelevät niitä vastaavia prototyyppejä. JavaScriptissä prototyypit ovat toinen objekti, joka määrittää valitun objektin oletusominaisuudet ja -menetelmät. Hyökkääjä hyödyntää prototyyppisaastetta ruiskuttamalla haitallista koodia näihin prototyyppeihin manipuloimalla kohteen ominaisuuksia tai käyttämällä toimintoa, joka yhdistää objekteja rekursiivisesti.

Tämä opas selittää tapoja estää prototyyppien saastehyökkäykset.







Estä prototyyppien saastehyökkäykset?

Prototyyppien saastehyökkäysten perimmäinen syy on se, että JavaScript-objektit perivät ominaisuudet prototyypiltään. Tämä tarkoittaa, että jos hyökkääjä voi syöttää haitallista koodia prototyyppiin, kaikki kyseiseltä prototyypillä perineet objektit perivät sen. Tämä johtaa tietojen varastamiseen, mielivaltaisen koodin suorittamiseen tai muiden sovellusten hallintaan.



Alla olevassa koodinpätkässä prototyypin saastekoodi ruiskutetaan:



const y = { a: 1 , b: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'viallinen': tosi}}' ) ;

const c = Object.assign ( { } , ja data ) ;
console.log ( c.vikainen ) ;


Yllä olevan koodinpätkän kuvaus:





    • Ensin lista nimeltä ' ja ” luodaan ja tallentaa arvot avain-arvo-pariin.
    • Avulla ' -siksi- ”, satunnainen saastunut koodi on toteutettu avainarvomuodossa. Avain on asetettu asentoon ' viallinen ' ja määritetty arvo ' totta ”.
    • Sitten tämä saastunut koodi määrätään ' ja ' -luettelo käyttämällä ' assign() ' -menetelmää, ja tuloksena oleva luettelo tallennetaan uuteen luetteloon nimeltä ' c ”.
    • Lopuksi syötetty saastunut koodi ' c ” lista haetaan ja sen arvo näytetään konsolin päällä. Sen varmistamiseksi, että saasteita tai haitallisia tietoja on syötetty.

Kun sisältävä tiedosto on suoritettu, tulos näyttää, että haitallinen koodi on lisätty onnistuneesti ja sen arvo on haettu:



Kuinka estää prototyyppien saastehyökkäykset?

On olemassa useita lähestymistapoja, joilla prototyyppisaastehyökkäys voidaan estää:

Epäturvalliset rekursiiviset yhdistämiset:

Vältä epävarmoja rekursiivisia yhdistämisiä, koska ne voivat johtaa prototyyppisaastehyökkäuksiin:

missä yhdistä = ( kestää , src ) = > {
varten ( var attribuutteja sisään src ) {
jos ( tyyppi ( kestää [ attribuutteja ] ) === 'obj' && tyyppi ( src [ attribuutteja ] ) === 'obj' )
{
yhdistää ( kestää [ attribuutteja ] , src [ attribuutteja ] ) ;
} muu {
kestää [ attribuutteja ] = src [ attribuutteja ] ;
}
}
palata kestää ;
} ;


Yllä olevassa koodissa:

    • Ensinnäkin mukautettu toiminto ' yhdistää() ' luodaan, joka hyväksyy kaksi taulukkoparametria ' kestää ' ja ' src ”.
    • Tehostettu ' varten 'silmukkaa käytetään muuttujan iteroimiseen' attribuutteja 'edellytysten yli' src ” parametri.
    • Käytä silmukan sisällä ' jos ”-lause, joka liikkuu molempien virheiden läpi ja jos jollakin molemmissa taulukoissa olevalla elementillä on sama tietotyyppi. Sitten nuo elementit välitetään parametreina samalle ' yhdistää() ”-funktio luo rekursiivisen luonteen.
    • Jos tyypit eivät ole samat, elementin arvo, joka sijaitsee ' src ' parametritaulukko välitetään ' kestää ” parametri.
    • Lopuksi ' kestää ” parametrinen matriisi palautetaan.

Prototyypin jäädyttäminen

Toinen prototyyppien saastehyökkäysten ehkäisy on jäädyttää niiden suoritussykli. Tämä tehdään ' Object.freeze() ”menetelmä. Alla olevassa koodinpätkässä yllä syötetty prototyyppinen saastunut koodi jäädytetään:

const y = { a: 1 , b: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'viallinen': tosi}}' ) ;

const c = Object.assign ( { } , ja data ) ;
console.log ( c.vikainen ) ;

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


Yllä olevan koodin selitys näkyy alla:

    • Aluksi valeprototyypin saastunut koodi ruiskutetaan valeluetteloon. ja ” aivan kuten yllä olevassa osiossa selitettiin.
    • Sitten ruiskutettu saastunut avain ' viallinen ' välitetään ' jäädyttää () ” tapa jäädyttää saastunut osa.
    • Lopuksi vahvistamaan jäädytetyn prototyypin pilaantumisen osa. ' viallinen 'luettelon avain' c ' välitetään ' on jäässä() ”menetelmä. Tämä menetelmä palauttaa ' totta 'jos on jäätynyt ja ' väärä ', jos se on jäätynyt:

Sisältävän koodin suorittamisen jälkeen tulos näyttää, että jäädytetyn saastuneen koodin injektio, jäädytys ja tarkistus:


Lisävinkkejä prototyyppien saastehyökkäyksen estämiseen

Alla on muutamia lisävinkkejä, joiden avulla prototyyppisaastehyökkäys voidaan estää:

    • Vaihtoehto ' -proto pois käytöstä ' voidaan käyttää estämään tai lopettamaan '' prototyyppi.__proto__ ” omaisuutta.
    • Älä käytä menetelmiä ' prototyyppi ”.
    • Tekijä: ' Käyttäjän syötteen puhdistaminen ', joka sisältää käyttäjän syötteiden tarkistamisen ja suodattamisen haitallisen tai saastuneen koodin poistamiseksi.
    • Käyttö ' sallittujen luettelo ”, joka on luettelo kohteen sallituista ominaisuuksista ja menetelmistä. Kaikki yritykset asettaa tai hankkia ominaisuuksia tai menetelmiä, jotka eivät ole sallittujen luettelon jäseniä, estetään.

Siinä kaikki Node.js:n prototyyppien saastehyökkäysten estämisestä.

Johtopäätös

Prototyyppien saastehyökkäysten estämiseksi on olemassa erilaisia ​​lähestymistapoja, kuten epävarman rekursiivisen yhdistämisen välttäminen, prototyypin jäädyttäminen ja sallittujen luettelon käyttö estämään ' __siksi__ ”-ominaisuutta voidaan käyttää. Yhdessä ' -proto pois käytöstä ' vaihtoehtoja, välttäen '' Objekti.prototyyppi ”, ja ” käyttäjän syötteen puhdistaminen ” saastuneelle koodille. Tämä opas on havainnollistanut prototyyppien saastehyökkäysten ehkäisemistä Nodejsissa.