Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
January 26, 2023 04:52 pm GMT

Protegendo sua API NodeJs contra ReDos Attack[Parte 3]

Ok! Vimos o que uma expresso regular, como utiliz-la, o que um ReDos e como podemos resolver esse problema!

Caso voc tenha cado aqui de paraquedas, seguem os links para as duas primeiras partes desse artigo:
Parte 1 (Definio do problema)
Parte 2 (Construo de uma possvel soluo)

Agora chegou a hora de testar nossa soluo e fazer algumas consideraes acerca da mesma. Bora ver se o que construmos de fato funciona ?

Primeiramente vamos executar o mesmo teste que fizemos quando utilizamos a abordagem que acabava travando toda a nossa API.
Conforme podemos ver a seguir, ao utilizar o mesmo payload que causou problemas anteriormente, dessa vez nosso sistema no sofreu com nenhum impacto pois a thread que acabou travando foi a thread da micro vm que criamos, e dado que acabou gerando um timeout, ns apenas recebemos uma mensagem dizendo que um timeout ocorreu, mas nossa API segue firme e forte .

Timeout

Nosso endpoint de teste de responsividade tambm continua a todo vapor.

Server up and running

Ok vimos que de fato nossa API no est mais travando quando recebe um payload malicioso. Porm temos que nos fazer seguinte pergunta, Ok, funcionou, mas essa soluo escalvel?, sempre que implementamos uma soluo para um dado problema.

Ento vamos testar a responsividade de nossa API sob alta carga e para isso vamos usar uma ferramenta de teste de carga chamada K6.

O K6 uma ferramenta utilizada para testar aplicao com diferentes cenrios de teste de carga(teste de absoro, teste de estresse dentre outros). uma tima ferramenta e sugiro, para aqueles que no a conhecem, ler mais a respeito desse carinha. Clique aqui e conhea o K6.

A seguir temos o nosso arquivo de teste de carga. um teste simples, basicamente vamos testar nossa API contra uma quantidade considervel de requisies simultneas e ver como ela se comporta no que diz respeito memria e uso de CPU.

import http from "k6/http";import { check, sleep } from "k6";export const options = {  stages: [    { duration: "2m", target: 250 }, // Simula um aumento de 0 at 100 requisies, em um perodo de 2 minutos    { duration: "2m", target: 300 }, // Permanee em 300 requisies por 2 min    { duration: "1m", target: 0 }, // Desce para 0 requisies ao longo de 1 minuto  ],};const BASE_URL = "http://192.168.2.176:3000"; // Aqui eu coloquei o ip do computador que estava rodando a api, utilizei um outro computador para rodar o teste para garantir que no haveriam interfernciasexport default () => {  const headers = { "Content-Type": "application/json" };  // Primeiro envio um payload malicioso, simulando um ataque  const maliciusPatternResult = http.post(    `${BASE_URL}/validate-form-safe`,    JSON.stringify({      email: "[email protected]",      password: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",    }),    { headers: headers }  );  // Verifico para ver se recebi um timeout como resposta  check(maliciusPatternResult, {    "Bad-request-blocked-successfully": (response) => {      return (        JSON.parse(response.body).message === "Email ou senha so invlidos"      );    },  });  // Depois envio um payload vlido paar verificar se a api est funcionando como deveria e no foi prejudicada pelo payload malicioso enviado anteriorment  const validPatternResult = http.post(    `${BASE_URL}/validate-form-safe`,    JSON.stringify({      email: "[email protected]",      password: "ab.cd.Zz",    }),    { headers: headers }  );  // Aqui verifico a resposta para checar se a resposta foi correta  check(validPatternResult, {    "Valid-Pattern-Accepted-successfully": (response) =>      JSON.parse(response.body).isValidForm === true,  });  // Por fim fao uma requisio para o endpoint de checagem da api, para ver e ele ainda est respondendo  const serverCheckResponse = http.get(`${BASE_URL}/test-server`).json();  // e verifico se ele de fato est ativo  check(serverCheckResponse, {    "servidor responsivo": (obj) =>      obj.message === "Servidor est respondendo normalmente",  });  sleep(1); // apenas um pequeno timer entre uma iterao do teste e outra};

Aps rodar o teste de carga em outro computador para no afetar o desempenho de nossa API, utilizando um computador com processador de 4 ncles e 8GB de RAM, alm de ter subido a nossa API utilizando o gerenciador de processos PM2 que consegue subir as aplicaes NodeJs em forma de cluster, caso no conhea o PM2, clique aqui e confira, consegui uma taxa de 300 request/segundo o que um resultado considervel considerando o que computador no era muito forte e considerando que internamente o nodeJs tem sim um overhead a mais para executar esse script em um contexto separado. Cumprimos nosso objetivo .

load-test result

Consideraes e dicas

Essa soluo que foi apresentada aqui extensvel para outras tarefas que podem ser bloqueantes, (clculo de hashes por exemplo). Se voc no tem certeza de que aquela operao ser rpida ou se pode ou no ser bloqueante, a soluo apresentada neste artigo pode ser uma forma de garantir que seu sistema no ir travar.

Aqui vo algumas dicas que podem ajudar a manter essa falha longe de suas APIs NodeJs.

  1. No escreva sua prpria regex: Evite criar suas prprias reges, principalmente se voc no for expert em expresses regulares, pois a chance de voc acabar criando um regex com essa falha muito grande.

  2. Use expresses regulares j prontas e validadas: Essa um complemento dica 1. Se precisar validar algo procure por expresses regulares que j foram validadas contra esse tipo de falha, e at mesmo outras falhas.

  3. Use validadores: Existem validadores j pronto que podem validar uma grande variedade de padres e muito provvel que j exista um validador para o que voc quer. Por exemplo:

  4. Validator.js

  5. Safe Regex

  6. Redos Detector

  7. Valide sua regex caso precise fazer uma: Se voc de fato precisar construir sua prpria expresso regular ento tente valid-la para saber se ela est vulnervel a essa falha. Alguns so:

  8. Devina

  9. RedosDetector

  10. Recheck

E por fim, a mais importante dica de todas

Entenda o que ela est fazendo!!! Estude sobre a expresso que voc quer usar, identifique o que ela est reconhecendo e como ela o est fazendo, estude expresses regulares para que voc pelo menos consiga dizer o que aquela expresso est validando.

E esse conselho se estende a todas as coisas que voc precisar utilizar, evite copiar e colar coisas sem saber o que aquilo est fazendo pois voc pode acabar inserindo brechas de segurana em seu sistema .

Bom por hoje foi isso pessoal, espero que esse artigo lhe ajude de alguma forma, fiquem com Deus e ate a prxima .


Original Link: https://dev.to/r9n/protegendo-sua-api-nodejs-contra-redos-attackparte-3-40g7

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To