Kaip užkirsti kelią prototipų taršos atakoms?

Kaip Uzkirsti Kelia Prototipu Tarsos Atakoms



Prototipo taršos ataka išnaudoja būdą, kaip „JavaScript“ objektai elgiasi su atitinkamais prototipais. „JavaScript“ programoje prototipai yra kitas objektas, apibrėžiantis numatytąsias pasirinkto objekto ypatybes ir metodus. Užpuolikas išnaudoja prototipo užterštumą, įterpdamas kenkėjišką kodą į šiuos prototipus, manipuliuodamas objekto savybėmis arba naudodamas funkciją, kuri rekursyviai sujungia objektus.

Šiame vadove paaiškinami būdai, kaip išvengti prototipų taršos atakų.







Užkirsti kelią prototipų taršos atakoms?

Pagrindinė prototipų taršos atakų priežastis yra ta, kad JavaScript objektai paveldi savybes iš savo prototipo. Tai reiškia, kad jei užpuolikas gali įvesti kenkėjišką kodą į prototipą, jį paveldės visi objektai, kurie paveldėjo iš to prototipo. Tai veda prie duomenų vagystės, savavališko kodo vykdymo arba kitų programų valdymo perėmimo.



Toliau pateiktame kodo fragmente bus įpurškiamas prototipo taršos kodas:



const y = { a: 1 , b: 2 } ;
const duomenys = JSON.parse ( '{'__proto__': { 'gedimas': tiesa}}' ) ;

const c = Object.assign ( { } , ir, duomenys ) ;
console.log ( c.sugedęs ) ;


Aukščiau pateikto kodo fragmento aprašymas:





    • Pirma, sąrašas pavadinimu „ ir “ yra sukurtas ir išsaugo reikšmes rakto-reikšmių poroje.
    • Su pagalba ' -todėl- “, atsitiktinis užterštas kodas yra įgyvendintas raktinės reikšmės formatu. Raktas nustatytas į ' sugedęs “ ir priskirta vertė „ tiesa “.
    • Tada šis užterštas kodas priskiriamas „ ir “ sąrašą, pasinaudojant „ priskirti () “ metodą, o gautas sąrašas išsaugomas naujame sąraše pavadinimu „ c “.
    • Galiausiai įšvirkštas užterštas kodas „ c “ sąrašas yra nuskaitomas ir jo reikšmė rodoma konsolėje. Užtikrinti, kad buvo įvesti tarša arba kenkėjiški duomenys.

Įvykdžius failą, kuriame yra, išvestis rodo, kad kenkėjiškas kodas buvo sėkmingai įvestas ir jo reikšmė nuskaityta:



Kaip užkirsti kelią prototipų taršos atakoms?

Yra keletas būdų, kaip užkirsti kelią taršos prototipo atakai:

Nesaugus rekursyvus sujungimas:

Venkite nesaugių rekursinių sujungimų, nes jie gali sukelti prototipų taršos atakas:

kur sujungti = ( paima , src ) = > {
dėl ( var atributai in src ) {
jeigu ( tipas ( paima [ atributai ] ) === 'obj' && tipas ( src [ atributai ] ) === 'obj' )
{
sujungti ( paima [ atributai ] , src [ atributai ] ) ;
} Kitas {
paima [ atributai ] = src [ atributai ] ;
}
}
grąžinti paima ;
} ;


Aukščiau pateiktame kode:

    • Pirma, pasirinktinė funkcija ' sujungti () “ yra sukurtas, kuris priima du masyvo parametrus “ paima “ ir „ src “.
    • Patobulintas ' dėl 'ciklas naudojamas kintamajam kartoti' atributai 'virš pateiktų' src ' parametras.
    • Ciklo viduje naudokite „ jeigu “ teiginys, kuris naršo per abi klaidas ir jei bet kuris elementas, esantis abiejuose masyvuose, turi tą patį duomenų tipą. Tada tie elementai perduodami kaip parametrai tam pačiam ' sujungti () “ funkcija, sukurianti rekursinį pobūdį.
    • Jei tipai nėra vienodi, elemento vertė, esanti „ src parametrų masyvas perduodamas į paima ' parametras.
    • Galiausiai „ paima “ grąžinamas parametrinis masyvas.

Prototipo užšaldymas

Kita prototipų taršos atakų prevencija yra sustabdyti jų vykdymo ciklą. Tai atliekama naudojant „ Object.freeze() “ metodas. Žemiau esančiame fragmente pirmiau įvestas prototipas užterštas kodas bus užšaldytas:

const y = { a: 1 , b: 2 } ;
const duomenys = JSON.parse ( '{'__proto__': { 'gedimas': tiesa}}' ) ;

const c = Object.assign ( { } , ir, duomenys ) ;
console.log ( c.sugedęs ) ;

console.log ( Objektas.užšaldyti ( c.sugedęs ) ) ;
console.log ( Objektas.yra Sušaldytas ( c.sugedęs ) ) ;


Aukščiau pateikto kodo paaiškinimas parodytas žemiau:

    • Iš pradžių fiktyvaus prototipo užterštas kodas bus įvestas į fiktyvų sąrašą. ir “, kaip paaiškinta aukščiau esančiame skyriuje.
    • Tada įšvirkštas užterštas raktas “ sugedęs “ yra perduodamas „ užšaldyti () “ būdas užšaldyti užterštą dalį.
    • Galiausiai, patvirtinti užšaldytą prototipo taršos dalį. „ sugedęs 'sąrašo klavišas' c “ yra perduodamas „ sušalęs() “ metodas. Šis metodas grąžina „ tiesa 'jeigu užšalęs ir ' klaidinga “, jei neužšalęs:

Įvykdžius kodą, kuriame yra, išvestis rodo, kad užšaldyto užteršto kodo įpurškimas, užšaldymas ir patikrinimas:


Papildomi patarimai, kaip užkirsti kelią prototipų taršos atakai

Toliau pateikiami keli papildomi patarimai, kuriuos naudojant galima išvengti taršos prototipo atakos:

    • Parinktis „ – išjungti-proto “ gali būti naudojamas norint išjungti arba sustabdyti „ prototipas.__proto__ ' nuosavybė.
    • Nenaudokite metodų su ' prototipas “.
    • pagal ' Vartotojo įvesties valymas “, kuris apima vartotojo įvesties patvirtinimą ir filtravimą, kad būtų pašalintas bet koks kenkėjiškas ar užterštas kodas.
    • Naudojimas ' baltasis sąrašas “, kuris yra leidžiamų objekto savybių ir metodų sąrašas. Bet kokie bandymai nustatyti ar gauti ypatybes ar metodus, kurie nėra baltojo sąrašo nariai, bus užblokuoti.

Tai viskas apie prototipų taršos atakų prevenciją Node.js.

Išvada

Siekiant užkirsti kelią prototipų taršos atakoms, naudojami tokie metodai kaip nesaugių rekursinių sujungimų išvengimas, prototipo užšaldymas ir baltojo sąrašo naudojimas siekiant užkirsti kelią __todėl__ ypatybę galima naudoti nuo nustatytos. Kartu su naudojimu ' – išjungti-proto “ parinkčių, vengiant naudoti „ Objektas.prototipas “ ir „ vartotojo įvesties valymas “ už užterštą kodą. Šis vadovas iliustruoja prototipų taršos atakų prevenciją Nodejs.