Jak zabránit útokům prototypového znečištění?

Jak Zabranit Utokum Prototypoveho Znecisteni



Útok prototypového znečištění využívá způsob, jakým objekty JavaScriptu nakládají se svými odpovídajícími prototypy. V JavaScriptu jsou Prototypy dalším objektem, který definuje výchozí vlastnosti a metody pro vybraný objekt. Útočník zneužije znečištění prototypu tak, že do těchto prototypů vloží škodlivý kód manipulací s vlastnostmi objektu nebo pomocí funkce, která objekty rekurzivně spojuje.

Tato příručka vysvětluje způsoby, jak zabránit prototypovým útokům znečištění.







Zabránit prototypovým útokům znečištění?

Základní příčinou prototypových útoků znečištění je to, že objekty JavaScriptu dědí vlastnosti ze svého prototypu. To znamená, že pokud se útočníkovi podaří vložit škodlivý kód do prototypu, zdědí ho všechny objekty, které z tohoto prototypu zdědily. To vede ke krádeži dat, spouštění libovolného kódu nebo převzetí kontroly nad jinými aplikacemi.



V níže uvedeném úryvku kódu bude vstříknut kód znečištění prototypu:



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

const c = Object.assign ( { } a, data ) ;
konzole.log ( c.vadný ) ;


Popis výše uvedeného fragmentu kódu:





    • Nejprve seznam s názvem „ a ” se vytvoří a uloží hodnoty do páru klíč–hodnota.
    • S pomocí ' –proto– “, je náhodně znečištěný kód implementován ve formátu klíč–hodnota. Klíč je nastaven na „ vadný “ a přiřazená hodnota „ skutečný “.
    • Poté je tento znečištěný kód přiřazen k „ a “ seznam vyvoláním „ přiřadit() “ a výsledný seznam se uloží do nového seznamu s názvem “ C “.
    • Nakonec vložený znečištěný kód do „ C ” se načte a jeho hodnota se zobrazí na konzole. Aby bylo zajištěno, že byla vložena znečištěná nebo škodlivá data.

Po spuštění obsahujícího souboru výstup ukazuje, že škodlivý kód byl úspěšně vložen a jeho hodnota byla načtena:



Jak zabránit útokům prototypového znečištění?

Existuje několik přístupů, kterými lze zabránit prototypovému znečištění:

Nezabezpečená rekurzivní sloučení:

Vyhněte se nezabezpečeným rekurzivním sloučením, protože mohou vést k prototypovým útokům znečištění:

kde sloučit = ( bere , src ) = > {
pro ( atributy var v src ) {
-li ( Typ ( bere [ atributy ] ) === 'obj' && Typ ( src [ atributy ] ) === 'obj' )
{
spojit ( bere [ atributy ] , src [ atributy ] ) ;
} jiný {
bere [ atributy ] = src [ atributy ] ;
}
}
vrátit se bere ;
} ;


Ve výše uvedeném kódu:

    • Nejprve vlastní funkce „ spojit() “ je vytvořen, který přijímá dva parametry pole “ bere ' a ' src “.
    • Vylepšená „ pro 'smyčka se používá k iteraci proměnné' atributy “nad poskytnutým” src ' parametr.
    • Uvnitř smyčky použijte „ -li ”, který projde oběma chybami a pokud nějaký prvek umístěný v obou polích má stejný datový typ. Poté jsou tyto prvky předány jako parametry stejnému „ spojit() “funkce vytvářející rekurzivní povahu.
    • Pokud typy nejsou stejné, hodnota prvku sídlící v „ src pole parametrů je předáno do „ bere ' parametr.
    • Konečně, „ bere ” se vrátí parametrické pole.

Zmrazení prototypu

Další prevencí prototypových útoků znečištění je zmrazení cyklu jejich provádění. To se provádí pomocí „ Object.freeze() “ metoda. V níže uvedeném úryvku bude výše vložený prototypový znečištěný kód zmrazen:

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

const c = Object.assign ( { } a, data ) ;
konzole.log ( c.vadný ) ;

konzole.log ( Object.freeze ( c.vadný ) ) ;
konzole.log ( Object.isFrozen ( c.vadný ) ) ;


Vysvětlení výše uvedeného kódu je uvedeno níže:

    • Zpočátku bude fiktivní prototyp znečištěný kód vložen do fiktivního seznamu “ a “, jak je vysvětleno ve výše uvedené části.
    • Poté vstříknutý znečištěný klíč „ vadný “ je předán do “ zmrazit() ” způsob zmražení znečištěné části.
    • Konečně, pro potvrzení zamrzlé prototypové části znečištění. ' vadný 'klíč seznamu' C “ je předán do “ isFrozen() “ metoda. Tato metoda vrací „ skutečný “ v případě zmrazení a “ Nepravdivé “ v případě nezmraženého:

Po provedení obsahujícího kódu výstup ukazuje, že vložení, zmrazení a ověření zmrazeného znečištěného kódu:


Další tipy, jak zabránit útoku znečištění prototypem

Některé další tipy, pomocí kterých lze zabránit prototypovému znečištění, jsou uvedeny níže:

    • Možnost „ –zakázat-proto “ lze použít k deaktivaci nebo zastavení fungování „ prototyp.__proto__ ' vlastnictví.
    • Nepoužívejte metody s pomocí „ prototyp “.
    • Podle „ Dezinfekce uživatelského vstupu “, která zahrnuje ověřování a filtrování uživatelského vstupu za účelem odstranění jakéhokoli škodlivého nebo znečištěného kódu.
    • Použití ' whitelist “, což je seznam povolených vlastností a metod pro objekt. Jakékoli pokusy o nastavení nebo získání vlastností nebo metod, které nejsou členem bílé listiny, budou blokovány.

To je vše o prevenci prototypových útoků znečištění v Node.js.

Závěr

Aby se zabránilo útokům znečištění prototypem, používají se přístupy, jako je vyhýbání se nezabezpečeným rekurzivním sloučením, zmrazení prototypu a použití bílé listiny k zabránění „ __proto__ ” lze použít vlastnost z nastavení. Spolu s využitím „ –zakázat-proto “, vyhněte se použití “ Objekt.prototyp ', a ' dezinfekce uživatelského vstupu ” pro znečištěný kód. Tato příručka ilustruje prevenci prototypových útoků znečištění v Nodejs.