Como posso reconhecer um regex maligno?
Eu recentemente me dei conta deExpressão Regular Negação de Serviço ataques, e decidi erradicar os padrões de regex 'malignos' onde quer que eu pudesse encontrá-los em minha base de código - ou pelo menos aqueles que são usados na entrada do usuário. Os exemplos dados noLink OWASP acima ewikipedia são úteis, mas eles não fazem um ótimo trabalho de explicar o problema em termos simples.
Uma descrição de regexes malignos, dewikipedia:
a expressão regular aplica repetição ("+", "*") a uma subexpressão complexa;para a subexpressão repetida, existe uma correspondência que também é um sufixo de outra correspondência válida.Com exemplos, novamente dewikipedia:
(a+)+
([a-zA-Z]+)*
(a|aa)+
(a|a?)+
(.*a){x}
para x> 10Este é um problema que simplesmente não tem uma explicação mais simples? Estou procurando algo que facilite evitar esse problema ao escrever regexes ou encontrá-los em uma base de código existente.