A prototípus-szennyezési támadás kihasználja azt a módot, ahogy a JavaScript objektumok kezelik a megfelelő prototípusokat. A JavaScriptben a prototípusok egy másik objektum, amely meghatározza a kiválasztott objektum alapértelmezett tulajdonságait és metódusait. A támadó úgy használja ki a prototípus szennyeződését, hogy rosszindulatú kódot fecskendez be ezekbe a prototípusokba az objektum tulajdonságainak manipulálásával vagy olyan funkció használatával, amely rekurzív módon egyesíti az objektumokat.
Ez az útmutató elmagyarázza a prototípus-szennyezés elleni támadások megelőzésének módjait.
Megakadályozza a prototípus-szennyezési támadásokat?
A prototípus-szennyezési támadások kiváltó oka az, hogy a JavaScript objektumok tulajdonságait öröklik a prototípusuktól. Ez azt jelenti, hogy ha egy támadó rosszindulatú kódot tud fecskendezni a prototípusba, azt minden objektum örökli, amely a prototípustól örökölte. Ez adatok ellopásához, tetszőleges kód végrehajtásához vagy más alkalmazások irányításának átvételéhez vezet.
Az alábbi kódrészletben a prototípus szennyezési kódot kell beadni:
const y = { a: 1 , b: 2 } ;
const data = JSON.parse ( '{'__proto__': { 'hibás': igaz}}' ) ;
const c = Object.assign ( { } , és, adatok ) ;
console.log ( c.hibás ) ;
A fenti kódrészlet leírása:
-
- Először a „ és ” jön létre, és tárolja az értékeket a kulcs-érték párban.
- Segítségével ' -ebből adódóan- ”, a véletlenszerű szennyezett kód kulcsérték formátumban kerül megvalósításra. A kulcs a „ hibás ' és a hozzárendelt értéke igaz ”.
- Ezután ez a szennyezett kód hozzá van rendelve a „ és ' listát a ' hozzárendelni() ” módszerrel, és az eredményül kapott lista egy új listában kerül tárolásra, melynek neve „ c ”.
- Végül a beinjektált szennyezett kód a „ c ” lista lekérésre kerül, és értéke megjelenik a konzolon. Annak biztosítása érdekében, hogy a szennyezés vagy a rosszindulatú adatok bekerüljenek.
A tartalmazó fájl végrehajtása után a kimenet azt mutatja, hogy a rosszindulatú kód sikeresen befecskendezve, és az értékét lekértük:
Hogyan lehet megakadályozni a prototípus szennyezési támadásokat?
Számos megközelítés létezik a prototípus szennyezési támadás megelőzésére:
Nem biztonságos rekurzív egyesítések:
Kerülje el a bizonytalan rekurzív összevonásokat, mert prototípus szennyezési támadásokhoz vezethetnek:
ahol egyesítés = ( veszi , src ) = > {számára ( var attribútumok ban ben src ) {
ha ( típusú ( veszi [ attribútumokat ] ) === 'obj' && típusú ( src [ attribútumokat ] ) === 'obj' )
{
összeolvad ( veszi [ attribútumokat ] , src [ attribútumokat ] ) ;
} más {
veszi [ attribútumokat ] = src [ attribútumokat ] ;
}
}
Visszatérés veszi ;
} ;
A fenti kódban:
-
- Először is az egyéni funkció összeolvad() ' jön létre, amely két tömbparamétert fogad el ' veszi ” és „ src ”.
- A továbbfejlesztett „ számára ' ciklus a változó iterálására szolgál ' attribútumokat ' a megadott felett ' src ” paramétert.
- A hurkon belül használjon egy „ ha ” utasítás, amely mindkét hibában navigál, és ha mindkét tömbben található bármely elem azonos adattípussal rendelkezik. Ezután ezeket az elemeket paraméterként adjuk át ugyanazon ' összeolvad() ” függvény rekurzív jelleget hoz létre.
- Ha a típusok nem azonosak, akkor a „ src ' paramétertömb átadásra kerül a ' veszi ” paramétert.
- Végül a „ veszi ” paraméteres tömböt ad vissza.
A prototípus lefagyasztása
A prototípus szennyezési támadások másik megelőzése a végrehajtási ciklus leállítása. Ez a „ Object.freeze() ” módszerrel. Az alábbi részletben a fent beinjektált prototípus szennyezett kód lefagy:
const y = { a: 1 , b: 2 } ;const data = JSON.parse ( '{'__proto__': { 'hibás': igaz}}' ) ;
const c = Object.assign ( { } , és, adatok ) ;
console.log ( c.hibás ) ;
console.log ( Tárgy.fagy ( c.hibás ) ) ;
console.log ( Object.isFrozen ( c.hibás ) ) ;
A fenti kód magyarázata az alábbiakban látható:
-
- Kezdetben ál-prototípus szennyezett kódot fognak beadni a dummy listába. és ” pont a fenti részben leírtak szerint.
- Ezután a befecskendezett szennyezett kulcs ' hibás ' átkerül a ' fagy() ” módszer a szennyezett rész lefagyasztására.
- Végül, hogy erősítse meg a fagyasztott prototípus szennyezés része. A ' hibás ' lista kulcsa ' c ' átkerül a ' fagyott() ” módszerrel. Ez a módszer a következőt adja vissza igaz ' fagyott és ' hamis ” nem fagyott állapotban:
A tartalmazó kód végrehajtása után a kimenet azt mutatja, hogy a befagyasztott szennyezett kód befecskendezése, lefagyasztása és ellenőrzése:
További tippek a prototípus-szennyezés támadásainak megelőzésére
Az alábbiakban felsorolunk néhány további tippet, amelyek segítségével megelőzhető a prototípus szennyezési támadás:
-
- A „ -disable-proto ' használható a ' prototípus.__proto__ ' ingatlan.
- Ne használjon módszereket a „ prototípus ”.
- írta: ' A felhasználói bevitel fertőtlenítése ”, amely magában foglalja a felhasználói bevitel érvényesítését és szűrését a rosszindulatú vagy szennyezett kódok eltávolítása érdekében.
- Használata ' fehérlista ”, amely egy objektum engedélyezett tulajdonságainak és metódusainak listája. Az engedélyezési listán nem szereplő tulajdonságok vagy metódusok beállítására vagy lekérésére irányuló kísérletek blokkolva lesznek.
Ez minden a Node.js prototípus-szennyezési támadásainak megelőzéséről szól.
Következtetés
A prototípusok által okozott szennyezés elleni támadások megelőzése érdekében olyan megközelítéseket kell alkalmazni, mint a nem biztonságos rekurzív egyesítések elkerülése, a prototípus lefagyasztása és az engedélyezőlista használata a „ __ebből adódóan__ ” tulajdonság használható. A „ -disable-proto ” opciók, elkerülve a „ Objektum.prototípus ”, és „ a felhasználói bevitel fertőtlenítése ” a szennyezett kódhoz. Ez az útmutató bemutatja a prototípus szennyezési támadások megelőzését a Nodejs-ben.