← Recursos RESOURCE
Como evitar expressões regulares lentas e o backtracking catastrófico (ReDoS) que paralisa serviços.

A maioria das expressões regulares é muito rápida, mas certos padrões podem ter o tempo de execução aumentando exponencialmente conforme o tamanho da entrada. Isso se chama backtracking catastrófico, e o ataque que usa entradas maliciosas para travar o servidor é chamado de ReDoS (negação de serviço por expressão regular).

A causa mais comum são os quantificadores aninhados. Quando uma repetição se sobrepõe a outra, como em (a+)+ ou (.*)*, e o que vem depois falha, o motor tenta todas as divisões possíveis e explode. Uma alternância ambígua como (a|a)* causa o mesmo problema.

O ponto central da prevenção é eliminar a ambiguidade. Junte as repetições que se sobrepõem em uma só, estreite o intervalo usando algo como [^x]* em vez de .*, e, quando possível, considere grupos atômicos ou quantificadores possessivos (que não existem em JavaScript). Limitar o tamanho da entrada também é eficaz na prática.

Como este testador roda no navegador, um padrão perigoso apenas deixa a sua aba um pouco lenta por um instante; mas, antes de usar o mesmo padrão no servidor com entradas não confiáveis, verifique sempre o desempenho.