Come prevenire attacchi di inquinamento prototipo?

Come Prevenire Attacchi Di Inquinamento Prototipo



L'attacco di inquinamento dei prototipi sfrutta il modo in cui gli oggetti JavaScript gestiscono i loro prototipi corrispondenti. In JavaScript, i prototipi sono un altro oggetto che definisce le proprietà e i metodi predefiniti per l'oggetto selezionato. Un utente malintenzionato sfrutta l’inquinamento dei prototipi iniettando codice dannoso in questi prototipi manipolando le proprietà dell’oggetto o utilizzando una funzione che unisce ricorsivamente gli oggetti.

Questa guida spiega come prevenire gli attacchi di inquinamento dei prototipi.







Prevenire attacchi di inquinamento prototipo?

La causa principale degli attacchi di inquinamento dei prototipi è che gli oggetti JavaScript ereditano le proprietà dal loro prototipo. Ciò significa che se un utente malintenzionato riesce a inserire codice dannoso nel prototipo, questo verrà ereditato da tutti gli oggetti ereditati da quel prototipo. Ciò porta al furto di dati, all'esecuzione di codice arbitrario o al controllo di altre applicazioni.



Nello snippet di codice seguente, verrà inserito il codice inquinamento prototipo:



const y = { UN: 1 , B: 2 } ;
dati const = JSON.parse ( '{'__proto__': { 'difettoso': vero}}' ) ;

const c = Oggetto.assegna ( { } e dati ) ;
console.log ( c.difettoso ) ;


La descrizione dello snippet di codice sopra:





    • Innanzitutto, l'elenco denominato ' E ' viene creato e memorizza i valori nella coppia chiave-valore.
    • Con l'aiuto di ' -Perciò- ”, il codice inquinato casuale viene implementato nel formato valore-chiave. La chiave è impostata su “ difettoso ' e il valore assegnato di ' VERO ”.
    • Quindi, questo codice inquinato viene assegnato al “ E ' elenco richiamando il ' assegnare() ' e l'elenco risultante viene memorizzato in un nuovo elenco denominato ' C ”.
    • Infine, il codice inquinato inserito nella “ C 'L'elenco viene recuperato e il suo valore viene visualizzato sulla console. Per garantire che siano stati immessi inquinamento o dati dannosi.

Dopo aver eseguito il file contenente, l'output mostra che il codice dannoso è stato iniettato con successo e il suo valore è stato recuperato:



Come prevenire attacchi di inquinamento prototipo?

Esistono diversi approcci con cui è possibile prevenire l’attacco di inquinamento del prototipo:

Unioni ricorsive non sicure:

Evita le fusioni ricorsive insicure perché possono portare ad attacchi di inquinamento del prototipo:

dove unisci = ( prende , src ) = > {
per ( attributi var In src ) {
Se ( tipo di ( prende [ attributi ] ) === 'oggetto' && tipo di ( src [ attributi ] ) === 'oggetto' )
{
unire ( prende [ attributi ] , src [ attributi ] ) ;
} altro {
prende [ attributi ] = src [ attributi ] ;
}
}
ritorno prende ;
} ;


Nel codice sopra:

    • Innanzitutto, la funzione personalizzata “ unisci() ' viene creato che accetta due parametri di array ' prende ' E ' src ”.
    • Il potenziato” per 'il ciclo viene utilizzato per iterare la variabile' attributi 'oltre quanto previsto' src 'parametro.
    • All'interno del ciclo, utilizzare un ' Se ' che esplora entrambi gli errori e se qualsiasi elemento che risiede in entrambi gli array ha lo stesso tipo di dati. Quindi quegli elementi vengono passati come parametri allo stesso ' unisci() ” funzione che crea una natura ricorsiva.
    • Se i tipi non sono gli stessi, il valore dell'elemento risiede nel ' src L'array di parametri viene passato al ' prende 'parametro.
    • Infine, il “ prende 'viene restituito l'array parametrico.

Congelamento del prototipo

Un’altra prevenzione per gli attacchi di inquinamento dei prototipi è congelarne il ciclo di esecuzione. Questo viene fatto tramite il ' Object.freeze() ' metodo. Nello snippet seguente, il codice inquinato prototipato sopra iniettato verrà congelato:

const y = { UN: 1 , B: 2 } ;
dati const = JSON.parse ( '{'__proto__': { 'difettoso': vero}}' ) ;

const c = Oggetto.assegna ( { } e dati ) ;
console.log ( c.difettoso ) ;

console.log ( Blocco.oggetto ( c.difettoso ) ) ;
console.log ( L'oggetto.è congelato ( c.difettoso ) ) ;


La spiegazione del codice precedente è mostrata di seguito:

    • Inizialmente, il codice inquinato del prototipo fittizio verrà inserito nell’elenco dei fittizi “ E 'proprio come spiegato nella sezione precedente.
    • Poi, la chiave inquinata iniettata” difettoso ' viene passato al ' congelare() ” metodo per congelare la parte inquinata.
    • Infine, per confermare la parte di inquinamento del prototipo congelato. IL ' difettoso “chiave dell’elenco” C ' viene passato al ' è congelato() ' metodo. Questo metodo restituisce ' VERO ” in caso di surgelati e “ falso ” in caso di scongelamento:

Dopo aver eseguito il codice contenente, l'output mostra che l'iniezione, il congelamento e la verifica del codice inquinato congelato:


Ulteriori suggerimenti per prevenire l'attacco di inquinamento del prototipo

Di seguito sono riportati alcuni suggerimenti aggiuntivi con cui è possibile prevenire l'attacco di inquinamento del prototipo:

    • L’opzione di “ –disable-proto ' può essere utilizzato per disabilitare o interrompere il funzionamento del ' prototipo.__proto__ ' proprietà.
    • Non utilizzare metodi con l'aiuto di “ prototipo ”.
    • Di ' Sanificazione dell'input dell'utente ' che prevede la convalida e il filtraggio dell'input dell'utente per rimuovere qualsiasi codice dannoso o inquinato.
    • Uso di ' lista bianca ”, che è un elenco di proprietà e metodi consentiti per un oggetto. Qualsiasi tentativo di impostare o ottenere proprietà o metodi che non sono membri della whitelist verrà bloccato.

Questo è tutto incentrato sulla prevenzione degli attacchi di inquinamento dei prototipi in Node.js.

Conclusione

Per prevenire attacchi di inquinamento del prototipo, approcci come evitare unioni ricorsive non sicure, congelare il prototipo e utilizzare una lista bianca per prevenire il ' __Perciò__ È possibile utilizzare la proprietà 'da impostare. Insieme all’utilizzo di “ –disable-proto ', evitando l'uso di ' Oggetto.prototipo ', E ' disinfettare l'input dell'utente ' per codice inquinato. Questa guida ha illustrato la prevenzione di prototipi di attacchi di inquinamento in Nodejs.