Como prevenir ataques de poluição por protótipo?

Como Prevenir Ataques De Poluicao Por Prototipo



O ataque de poluição de protótipo explora a maneira como os objetos JavaScript lidam com seus protótipos correspondentes. Em JavaScript, os protótipos são outro objeto que define as propriedades e métodos padrão para o objeto selecionado. Um invasor explora a poluição do protótipo injetando código malicioso nesses protótipos, manipulando as propriedades do objeto ou usando uma função que mescla objetos recursivamente.

Este guia explica as formas de prevenir ataques de poluição de protótipos.







Prevenir ataques de poluição por protótipo?

A causa raiz dos ataques de poluição de protótipos é que os objetos JavaScript herdam propriedades de seus protótipos. Isso significa que se um invasor puder injetar código malicioso no protótipo, ele será herdado por todos os objetos herdados desse protótipo. Isso leva ao roubo de dados, à execução de código arbitrário ou ao controle de outros aplicativos.



No trecho de código abaixo, o código de poluição do protótipo será injetado:



const y = { a: 1 , b: 2 } ;
dados const = JSON.parse ( '{'__proto__': { 'com defeito': verdadeiro}}' ) ;

const c = Object.assign ( { } e, dados ) ;
console.log ( c.defeituoso ) ;


A descrição do trecho de código acima:





    • Primeiro, a lista chamada “ e ”é criado e armazena os valores no par chave-valor.
    • Com a ajuda de ' -portanto- ”, o código poluído aleatório é implementado no formato de valor-chave. A chave está definida como “ defeituoso ”E o valor atribuído de“ verdadeiro ”.
    • Então, esse código poluído é atribuído ao “ e ”lista invocando o“ atribuir() ”Método, e a lista resultante é armazenada em uma nova lista chamada“ c ”.
    • Finalmente, o código poluído injetado no “ c ”A lista é recuperada e seu valor é exibido no console. Para garantir que poluição ou dados maliciosos foram injetados.

Depois de executar o arquivo que o contém, a saída mostra que o código malicioso foi injetado com sucesso e seu valor foi recuperado:



Como prevenir ataques de poluição por protótipo?

Existem várias abordagens pelas quais o ataque de poluição do protótipo pode ser evitado:

Fusões recursivas inseguras:

Evite fusões recursivas inseguras porque elas podem levar a ataques de poluição de protótipos:

onde mesclar = ( leva , src ) = > {
para ( atributos var em fonte ) {
se ( tipo de ( leva [ atributos ] ) === 'obj' && tipo de ( fonte [ atributos ] ) === 'obj' )
{
mesclar ( leva [ atributos ] , src [ atributos ] ) ;
} outro {
leva [ atributos ] = fonte [ atributos ] ;
}
}
retornar leva ;
} ;


No código acima:

    • Primeiro, a função personalizada “ mesclar() ”é criado que aceita dois parâmetros de array“ leva ' e ' fonte ”.
    • O aprimorado “ para ”loop é utilizado para iterar a variável“ atributos ”acima do fornecido“ fonte ”parâmetro.
    • Dentro do loop, utilize um “ se ”Instrução que navega pelos dois erros e se algum elemento residente em ambas as matrizes tem o mesmo tipo de dados. Em seguida, esses elementos são passados ​​como parâmetros para o mesmo “ mesclar() ”função criando uma natureza recursiva.
    • Se os tipos não forem iguais, o valor do elemento residente em “ fonte ”A matriz de parâmetros é passada para o“ leva ”parâmetro.
    • Finalmente, o ' leva ”A matriz paramétrica é retornada.

Congelando o protótipo

Outra prevenção para ataques de poluição de protótipos é congelar o seu ciclo de execução. Isso é feito através do “ Object.freeze() ”Método. No trecho abaixo, o código poluído prototipado injetado acima será congelado:

const y = { a: 1 , b: 2 } ;
dados const = JSON.parse ( '{'__proto__': { 'com defeito': verdadeiro}}' ) ;

const c = Object.assign ( { } e, dados ) ;
console.log ( c.defeituoso ) ;

console.log ( Objeto.freeze ( c.defeituoso ) ) ;
console.log ( Object.isFrozen ( c.defeituoso ) ) ;


A explicação do código acima é mostrada abaixo:

    • Inicialmente, o código poluído do protótipo fictício será injetado na lista fictícia “ e ”Exatamente como explicado na seção acima.
    • Então, a chave poluída injetada “ defeituoso ”é passado para o“ congelar() ”Método para congelar a parte poluída.
    • Finalmente, para confirmar a parte congelada da poluição do protótipo. O ' defeituoso ”chave da lista“ c ”é passado para o“ está congelado() ”Método. Este método retorna “ verdadeiro ”em caso de congelado e“ falso ”em caso de descongelamento:

Depois de executar o código contido, a saída mostra que a injeção, congelamento e verificação do código poluído congelado:


Dicas adicionais para prevenir ataques de poluição por protótipo

Algumas dicas adicionais com as quais o ataque de poluição do protótipo pode ser evitado são indicadas abaixo:

    • A opção de “ –desabilitar-proto ”Pode ser usado para desativar ou interromper o funcionamento do“ protótipo.__proto__ ' propriedade.
    • Não use métodos com a ajuda de “ protótipo ”.
    • Por ' Limpando a entrada do usuário ”que envolve validar e filtrar a entrada do usuário para remover qualquer código malicioso ou poluído.
    • Uso de ' lista branca ”, que é uma lista de propriedades e métodos permitidos para um objeto. Quaisquer tentativas de definir ou obter propriedades ou métodos que não sejam membros da lista de permissões serão bloqueadas.

Isso é tudo sobre a prevenção de ataques de poluição de protótipos em Node.js.

Conclusão

Para evitar ataques de poluição do protótipo, abordagens como evitar fusões recursivas inseguras, congelar o protótipo e usar uma lista de permissões para evitar o “ __portanto__ ”A propriedade de ser definida pode ser usada. Junto com a utilização de “ –desabilitar-proto ”opções, evitando o uso de“ Objeto.protótipo ', e ' higienizando a entrada do usuário ”Para código poluído. Este guia ilustrou a prevenção de ataques de poluição de protótipos em Nodejs.