Ako zabrániť útokom prototypového znečistenia?

Ako Zabranit Utokom Prototypoveho Znecistenia



Útok prototypového znečistenia využíva spôsob, akým sa objekty JavaScriptu vyrovnávajú so zodpovedajúcimi prototypmi. V JavaScripte sú Prototypy ďalším objektom, ktorý definuje predvolené vlastnosti a metódy pre vybratý objekt. Útočník zneužije znečistenie prototypu vstreknutím škodlivého kódu do týchto prototypov manipuláciou s vlastnosťami objektu alebo pomocou funkcie, ktorá objekty rekurzívne spája.

Táto príručka vysvetľuje spôsoby, ako zabrániť prototypovým útokom znečistenia.







Zabrániť prototypovým útokom znečistenia?

Hlavnou príčinou prototypových útokov znečistenia je to, že objekty JavaScript dedia vlastnosti od svojho prototypu. To znamená, že ak útočník dokáže vložiť škodlivý kód do prototypu, zdedia ho všetky objekty, ktoré zdedili z tohto prototypu. To vedie k odcudzeniu údajov, spusteniu ľubovoľného kódu alebo prevzatiu kontroly nad inými aplikáciami.



V nižšie uvedenom úryvku kódu sa vloží prototypový kód znečistenia:



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

const c = Object.assign ( { } a, údaje ) ;
konzola.log ( c.chybný ) ;


Popis vyššie uvedeného útržku kódu:





    • Najprv zoznam s názvom „ a “ sa vytvorí a uloží hodnoty do páru kľúč – hodnota.
    • S pomocou ' –preto– “, je náhodne znečistený kód implementovaný vo formáte kľúč – hodnota. Kľúč je nastavený na „ chybný “ a priradená hodnota „ pravda “.
    • Potom sa tento znečistený kód priradí k „ a “ zoznam vyvolaním „ priradiť() “ a výsledný zoznam sa uloží do nového zoznamu s názvom “ c “.
    • Nakoniec vložený znečistený kód do „ c ” sa načíta zoznam a jeho hodnota sa zobrazí na konzole. Aby sa zabezpečilo, že sa vloží znečistenie alebo škodlivé údaje.

Po spustení súboru, ktorý obsahuje, výstup ukazuje, že škodlivý kód bol úspešne vložený a jeho hodnota bola získaná:



Ako zabrániť útokom prototypového znečistenia?

Existuje niekoľko prístupov, pomocou ktorých možno zabrániť prototypovému znečisteniu:

Nezabezpečené rekurzívne zlúčenia:

Vyhnite sa nezabezpečeným rekurzívnym zlúčeniam, pretože môžu viesť k prototypovým útokom znečistenia:

kde zlúčiť = ( berie , src ) = > {
pre ( atribúty var v src ) {
ak ( Typ ( berie [ atribúty ] ) === 'obj' && Typ ( src [ atribúty ] ) === 'obj' )
{
zlúčiť ( berie [ atribúty ] , src [ atribúty ] ) ;
} inak {
berie [ atribúty ] = src [ atribúty ] ;
}
}
vrátiť berie ;
} ;


Vo vyššie uvedenom kóde:

    • Po prvé, vlastná funkcia „ zlúčiť() ” je vytvorený, ktorý akceptuje dva parametre poľa “ berie “ a „ src “.
    • Vylepšené „ pre “cyklus sa používa na iteráciu premennej “ atribúty “nad poskytnutým” src parameter “.
    • Vo vnútri slučky použite „ ak “, ktorý prechádza oboma chybami a ak niektorý prvok nachádzajúci sa v oboch poliach má rovnaký typ údajov. Potom sa tieto prvky odovzdajú ako parametre tomu istému „ zlúčiť() “funkcia vytvárajúca rekurzívnu povahu.
    • Ak typy nie sú rovnaké, hodnota prvku nachádzajúca sa v „ src pole parametrov sa odovzdá do „ berie parameter “.
    • Nakoniec, „ berie ” sa vráti parametrické pole.

Zmrazenie prototypu

Ďalšou prevenciou prototypových útokov na znečistenie je zmrazenie ich cyklu vykonávania. To sa vykonáva prostredníctvom „ Object.freeze() “. V nižšie uvedenom úryvku bude vyššie vložený prototypový znečistený kód zmrazený:

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

const c = Object.assign ( { } a, údaje ) ;
konzola.log ( c.chybný ) ;

konzola.log ( Objekt.zmraziť ( c.chybný ) ) ;
konzola.log ( Object.isFrozen ( c.chybný ) ) ;


Vysvetlenie vyššie uvedeného kódu je uvedené nižšie:

    • Na začiatku sa do zoznamu fiktívnych prototypov vloží kód znečistený fiktívnym prototypom. a “ ako je vysvetlené v predchádzajúcej časti.
    • Potom vstreknutý znečistený kľúč „ chybný 'prechádza do ' zmraziť() ” spôsob zmrazovania znečistenej časti.
    • Nakoniec na potvrdenie zamrznutej časti prototypu znečistenia. ' chybný 'kľúč zoznamu' c 'prechádza do ' je zmrazený() “. Táto metóda vráti „ pravda “ v prípade mrazeného a “ falošný “ v prípade nezmrazeného:

Po vykonaní obsahujúceho kódu výstup ukazuje, že vloženie, zmrazenie a overenie zmrazeného znečisteného kódu:


Ďalšie tipy na zabránenie útoku znečistenia prototypom

Niektoré ďalšie tipy, pomocou ktorých možno zabrániť prototypovému znečisteniu, sú uvedené nižšie:

    • Možnosť „ –zakázať-proto “ môže byť použitý na zakázanie alebo zastavenie fungovania „ prototyp.__proto__ ' nehnuteľnosť.
    • Nepoužívajte metódy s pomocou „ prototyp “.
    • Podľa „ Dezinfekcia používateľského vstupu “, ktorá zahŕňa overenie a filtrovanie používateľských vstupov s cieľom odstrániť akýkoľvek škodlivý alebo znečistený kód.
    • Použitie ' whitelist “, čo je zoznam povolených vlastností a metód pre objekt. Všetky pokusy o nastavenie alebo získanie vlastností alebo metód, ktoré nie sú súčasťou zoznamu povolených, budú zablokované.

To je všetko o prevencii prototypových útokov znečistenia v Node.js.

Záver

Aby sa predišlo útokom na znečistenie prototypu, prístupy, ako je vyhýbanie sa nezabezpečeným rekurzívnym zlúčeniam, zmrazenie prototypu a používanie zoznamu povolených položiek na zabránenie „ __preto__ ” možno použiť vlastnosť z nastavovania. Spolu s využívaním „ –zakázať-proto “, vyhýbajúc sa použitiu “ Objekt.prototyp “ a „ dezinfekciu užívateľského vstupu ” pre znečistený kód. Táto príručka ilustruje prevenciu prototypových útokov znečistenia v Nodejs.