2008-10-13 20 views
10

Tengo un control de validación que tiene la siguiente expresión:ASP.NET Validador de expresiones regulares (Fortaleza de la contraseña)

(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,} 

Eso es una contraseña con al menos 2 dígitos , 2 caracteres alfabéticos, 1 no alfanumérico y mínimo de 8 caracteres. Lamentablemente, esto no parece ser compatible con varios navegadores.

Esta validación funciona perfectamente en Firefox, pero no en Internet Explorer.

Una combinación de cada uno de los resultados de respuestas de:

var format = "^(?=.{" + minLength + ",})" + 
    (minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") + 
    (minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") + 
    (minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$"; 

EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$" 

El dato importante es tener la longitud de la primera ({x,}?.).

Respuesta

14

(?=(.*\W.*){0,}) no es 0 caracteres no alfanuméricos. Es al menos 0 caracteres no alfanuméricos. Si desea que la contraseña no contenga caracteres no alfanuméricos, puede hacerlo (?!.*\W) o (?=\w*$).

Una solución más simple sería omitir el \W búsqueda anticipada, y usar \w{8,} en lugar de .{8,}.

Además, \w incluye \d. Si solo quería el alfa, podría hacerlo [^\W\d] o [A-Za-z].

/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/ 

Esto validar la contraseña para contener al menos dos dígitos, dos alfas, sea al menos 8 caracteres de longitud, y contiene sólo caracteres alfanuméricos (incluyendo subrayado).

  • \w = [A-Za-z0-9_]
  • \d = [0-9]
  • \s = [ \t\n\r\f\v]

Editar: usar esto en todos los navegadores es probable que tenga que hacer algo como esto:

var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$"); 
if (re.test(password)) { /* ok */ } 

Edit2: La reciente actualización de la pregunta casi invalida mi respuesta completa.^^;;

Debería ser capaz de utilizar el código JavaScript al final, si reemplaza el patrón con el que tenía originalmente.

Edit3: OK. Ahora entiendo a qué te refieres.

/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123") // matches 
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123") // does not match 
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123")     // matches 

Parece (?=) no es realmente de ancho cero en Internet Explorer.

http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html

Edit4: Más lectura: http://blog.stevenlevithan.com/archives/regex-lookahead-bug

creo que esto puede resolver su problema:

/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/ 
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})") 

Los (?=.{8,}$) tiene que venir primero.

+0

Sí, vi eso justo antes de publicar, probé y funcionó: D – nyxtom

-3

¿Qué tal uno de la fortaleza de la contraseña basada jQuery existente validadores - como: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html

+0

No bueno. Luego necesitaría validar nuevamente el lado del servidor y mantener la lógica dos veces. –

+2

Realmente debería estar validando por el lado del servidor independientemente de la validación del lado del cliente que se haya realizado. No hay garantía de que el cliente haya hecho lo que usted cree que debería (el navegador puede tener javascript desactivado, es posible que el cliente no sea un navegador). – marcj

1

Esto le dará 2 dígitos de 2 minutos, 2 min de caracteres y 8 caracteres de longitud mínima ... Me niego a mostrarle cómo no permitir que los usuarios tengan caracteres no alfanuméricos en sus contraseñas, ¿por qué los sitios quieren aplicar contraseñas menos seguras?

^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$ 
+0

Haha Acepto: P El 0 estaba allí porque está configurado en el lado del servidor (es un mínimo en lugar de 'puede tener 0 no alfanumérico') – nyxtom

+0

¿De qué manera tener caracteres no alfanuméricos hace que la contraseña sea menos segura? –

+0

[Releer] "... Me niego a mostrarle cómo ** no ** permitir que los usuarios tengan caracteres no alfanuméricos" – nyxtom

Cuestiones relacionadas