Problemas de Performance nas Regex para Identificação de Txid

EXIBINDO RESPOSTAS:

Avatar discord do usuario francisco.carvalho

francisco.carvalho

Boa tarde @everyone !

Retomando o assunto endpoint de configurações (https://www.notion.so/Endpoint-de-configura-es-0a97faee68f845ab96ec21551862fe6c).

Nosso time de engenharia observou que existem possíveis situações em que o match do regex com a string do txid pode demorar muitos segundos ou até minutos. Existem situações inclusive de crash da aplicação. Em outras palavras: não é seguro recebermos via input qualquer regex.

Um exemplo que vocês podem testar no browser:

let regexp = /^(\d+)$/;
let str = "012345678901234567890123456789z";
alert( regexp.test(str) );

O alert acima levará um longo tempo até que apareça. Imaginem isso no ato de recebimento de um Pix, no qual cada milisegundo é um fator determinante para um timeout inesperado.

A conclusão é que precisamos controlar melhor quais regex serão aceitas.

A proposta é, ao invés de receber um txidRegex, receber algo mais limitado que também atenda da mesma forma:

"recebimento": {
"txid": {
"comecaCom": "gnPix"
}
}

"recebimento": {
"txid": {
"terminaCom": "gnPix"
}
}

"recebimento": {
"txid": {
"contem": "gnPix"
}
}

comecaCom/terminaCom/contem: a-zA-Z0-9{0,15} //caracteres aceitos

Gostaria de opinião de vocês em relação a essa nova proposta, bem como sugestões dentro dessa nova abordagem.

Para quem interessar, uma referência sobre o assunto regexp-catastophic-backtracking com mais detalhes.
https://javascript.info/regexp-catastrophic-backtracking

Avatar discord do usuario rubenskuhl

rubenskuhl

Como é um match de txid nulo nessa versão restrita ? Pq os casos de txid com regras de formação que tínhamos pensado se enquadram nas regras mais restritas (ou seja, atendem).

Avatar discord do usuario anoni_mato

anoni_mato

o problema aqui não é a existência de parênteses? não tem razão nenhuma pra aceitar parênteses se eu não vou reutilizar os matchs individuais.

Avatar discord do usuario evanil

evanil

<@!691674311588577381> aqui o pessoal debate sobre a regex, curiosidade mesmo 🙂

Avatar discord do usuario joelemanoel

joelemanoel

Sugestões que me lembre até agora:
- Utilizar % bem parecido com o LIKE do MySQL;
- Utilizar iniciaCom e terminaCom;
- Utilizar o regex bloqueando o uso de "()" (faria com que não demorasse tanto);
- Enviar uma requisição para uma URL para homologar um txid, ex: {webhookUrl}/txidmatch (Essa necessitaria de uma homologação parecida com BACEN x PSP);

Avatar discord do usuario rubenskuhl

rubenskuhl

No fundo tudo isso pq o BACEN não pensou no caso de uso de carregamento de contas. Talvez sugerir algo, como as elétricas fizeram no reuso de location ?