Analisador de Risco ReDoS em Regex
Analisa uma expressão regular e aponta trechos com risco de ReDoS, como quantificadores aninhados e alternâncias ambíguas, sem executá-la.
Cole o corpo puro ou a forma literal /^(a+)+$/gi — as flags são separadas sozinhas.
A análise é estática: sua expressão é compilada só para checar a sintaxe e depois lida caractere a caractere. Ela nunca é executada contra entrada gerada, e nada do que você digita sai do navegador.
Trechos apontados
Achados
String de ataque sugerida
Não cole essa string de volta no campo acima e não rode em uma aba do navegador. Use em um benchmark com timeout, num processo separado que você possa matar.
Por que o retrocesso explode
JavaScript, Java, Python e PCRE usam motor com retrocesso: quando um caminho falha, ele volta e tenta a próxima divisão do mesmo texto. Em ^(a+)+$ contra trinta letras a seguidas de um ponto de exclamação, o motor precisa testar todas as formas de cortar essas letras em grupos antes de dizer não, e a conta dobra a cada letra a mais.
A checagem aqui é heurística e lê a forma da expressão, não o comportamento dela: relatório limpo não é prova de que a expressão é segura, e um achado não é prova de que dá para explorar no seu contexto. Ancorar, limitar a repetição com {0,50} e recusar entrada grande demais antes do match são as correções que sobrevivem a uma reescrita.
Onde uma regex trava com entrada curta
ReDoS é o travamento que aparece quando uma expressão regular precisa testar um número absurdo de caminhos para concluir que o texto não casa. A análise aqui é estática: a expressão é compilada só para checar a sintaxe e depois lida caractere a caractere, marcando os trechos suspeitos por posição. Nada é executado contra entrada gerada, então a aba não corre risco de congelar durante a checagem.
O caso clássico é ^(a+)+$. Contra trinta letras a seguidas de um ponto de exclamação, o motor tem que testar todas as formas de repartir essas trinta letras entre as duas repetições antes de responder que não casa, e cada letra a mais dobra a conta. Alternâncias como (a|ab)* caem no mesmo buraco, porque os dois ramos começam pelo mesmo caractere e o motor não sabe qual deles usar em cada posição.
O ponto que costuma escapar é que ancorar com ^ e $ ajuda, mas não cura: a âncora corta as tentativas em posições iniciais diferentes e não muda nada dentro do grupo aninhado. As correções que sobrevivem a uma revisão são limitar a repetição com {1,50}, deixar os ramos da alternância mutuamente exclusivos, recusar entrada acima de um tamanho antes de aplicar a regex e rodar validação pesada com timeout.
Perguntas frequentes
A ferramenta executa a minha expressão?
Nenhum achado quer dizer que a regex é segura?
Dá para corrigir sem reescrever a expressão?
Ferramentas Relacionadas
Gerador de Permissions-Policy
Monta o header Permissions-Policy a partir de uma lista feature=allowlist (ex: geolocation=()).
Escape SQL
Escape strings SQL adicionando barras invertidas em aspas simples e outros caracteres especiais para prevenir SQL injection.
Gerador de passphrase Diceware PT-BR
Gera senha-frase no estilo Diceware usando lista de 7776 palavras em português — entropia exibida em bits.