Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: gAb1 en 19 Abril 2016, 06:24 am



Título: regex para email catastrophic backtracking
Publicado por: gAb1 en 19 Abril 2016, 06:24 am
Estoy creando mi propio regex para validar emails pero no consigo hacer funcionar el límite de carácteres de los dos primeros grupos, el tercer grupo si que valida bien el máximo.

Código
  1. /^([\w]+(?:[\.\-][\w]+)*){1,64}@([\w]+(?:[\.\-][\w]+)*){1,64}\.([a-zA-Z]{2,7})$/

Si no me equivoco el error quiere decir que está mal optimizado y le da carga innecesaria al procesador, no?

Como se puede leer, lo que busco es que los guiones actuen de la misma manera que los puntos, que no se puedan poner delante ni detras, solo entre dos caracteres \w. Tanto para el nombre de usuario como para el nombre de dominio.

Gracias!


Título: Re: regex para email catastrophic backtracking
Publicado por: ivancea96 en 19 Abril 2016, 09:37 am
{1,64} no es un límite de caracteres. Es la cantidad de veces que se puede repetir lo que tiene detrás. Como detrás tienes:
Código:
([\w]+(?:[\.\-][\w]+)*)
Eso se va a repetir hasta 64 veces. Como tienes un *, no va a tener límite máximo.


Título: Re: regex para email catastrophic backtracking
Publicado por: gAb1 en 19 Abril 2016, 13:21 pm
Aaah vale, ya decia yo que algo parecia extraño. Entonces un límite de carácteres válido sería ponerlo delante de una clase de caráctares, no en un grupo nesteado que no tiene límite.

Código
  1. /^([\w\s]{4,10})$/

Para casos de grupos nesteados ¿es mejor usar la función php strlen()? o ¿hay alguna manera eficiente de hacer esto dentro del regex?

De todas maneras parece que si uso strlen() le doy más flexibilidad al usuario con el limite de carácteres. 100 carácteres maximos para un email está bien, ¿no?


Título: Re: regex para email catastrophic backtracking
Publicado por: ivancea96 en 19 Abril 2016, 18:32 pm
Ahí ya, tú verás. Sin embargo, lo ideal sería una validación completa por parte de regex.

Te serviría algo como:
Código
  1. /[0-9a-zA-Z](?:[0-9a-zA-Z\.\-]{0,62}[0-9a-zA-Z])?/

Claro que ahí permitiría varios puntos seguidos.
Un validador que mida la cadena exacta sin duda es algo difícil. Tu método, validando luego con otro lenguaje, pienso que es perfecto para no complicarse la vida xD


Título: Re: regex para email catastrophic backtracking
Publicado por: gAb1 en 20 Abril 2016, 17:32 pm
Si, y se te olvidaron las _ xD (un email sin _?  ;D)

Parece que lo mejor es strlen(), 100 para todo, más flexibilidad.