2011-11-21 26 views
18

Quiero crear una función que compara una contraseña contra algunos comúnmente idiotas, de manera que el usuario no puede elegir uno de ellos, pero la función que he escrito hasta ahora, cuando se ponen entre la escritura etiquetas, no hace que javascript sea reconocido (por Firebug). Supongo que la creación de la matriz es la culpa.creando la matriz de expresiones regulares Javascript

function unacceptable(pwd){ 
    var unforgivable = [ 
    /password/gi, /*g matches any occurance of sequence, i checks case insensitive*/ 
    /12345678/g, 
    /8675309/g, 
    /[a-z]{8,}/gi, 
    /qwerty/gi, 
    /asdfg/gi, 
    /qazwsx/gi, 
    /zxcvb/gi, 
    /letmein/gi, 
    /trustno1/gi, 
    /omnicloud/gi, 
    /monkey/gi]; 
    for (var i=0; i<unforgivable.length; i++) 
     if(pwd.match(unforgivable[i])) return true; 
    return false; 
} 
+0

Use [] para crear matrices, pwd.match (ptrn) para hacer corresponder una expresión regular, su bucle for falta(), ptrn en su ciclo sería el índice de matriz, no el valor, y probablemente debería cambiar a una configuración normal de lazo o añadir una hasOwnProperty comprobar – shesek

+0

Y crear la matriz expresiones regulares fuera de su función en lugar de volver a crear cada vez que se invoca la función. Además, la bandera g es bastante inútil aquí. – shesek

+0

@shesek que fija el lazo pero dice partido no es un método – Chris

Respuesta

31

que no es necesario el bucle para probar cada palabra que se puede poner a todos en una expresión regular (separados por el carácter |) y dejar que la mirada motor de expresiones regulares para cualquiera de todos ellos a la vez. Se podría hacer eso así:

function unacceptable(pwd){ 
    var unforgivable = [ 
     "password", 
     "12345678", 
     "8675309", 
     "[a-z]{8,}", 
     "qwerty", 
     "asdfg", 
     "qazwsx", 
     "zxcvb", 
     "letmein", 
     "trustno1", 
     "omnicloud", 
     "monkey" 
    ]; 
    var re = new RegExp(unforgivable.join("|"), "i"); 
    return re.test(pwd); 
} 

trabajo de demostración aquí: http://jsfiddle.net/jfriend00/cyVbC/

P. S. No tiene que poner todas las palabras en una matriz. Podrías predeclarar toda la expresión regular, pero pensé que ponerlos en la matriz de esta manera se convirtió en un código más fácil de leer que era más fácil de mantener.

También podría ser la siguiente:

var unforgivable = /password|12345678|8675309|[a-z]{8,}|qwerty|asdfg|qazwsx|zxcvb|letmein|trustno1|omnicloud|monkey/i; 

function unacceptable(pwd){ 
    return unforgivable.test(pwd); 
} 
+0

Estoy de acuerdo con la legibilidad, por lo que los tenía en una matriz. Estaba teniendo un problema con pwd que no tenía un método de coincidencia, pero al llamar 'toString()' en él solucionó eso. ¡Gracias por la ayuda! – Chris

+0

Cambiar de '.match()' a '.test()' que es más apropiado aquí. – jfriend00

0

Tiene una coma que se está alejando. No puede usar una coma final en javascript.

var unforgivable = new Array(
    /password/gi, /*g matches any occurance of sequence, i checks case insensitive*/ 
    /12345678/g, 
    /8675309/g, 
    /[a-z]{8,}/gi, 
    /qwerty/gi, 
    /asdfg/gi, 
    /qazwsx/gi, 
    /zxcvb/gi, 
    /letmein/gi, 
    /trustno1/gi, 
    /omnicloud/gi, 
    /monkey/gi 
) 
+3

Corrección: no puede usar la coma final en ES3. Está permitido desde ES5. – shesek

+0

Mi mal - que es cierto para los literales de matriz/objeto (que probablemente debería usar), no para llamadas a funciones. – shesek

9

me gusta usar Array.some, que detendrá la iteración a través de la matriz tan pronto como un valor de retorno es cierto:

function unacceptable(pwd){ 
    return [ 
     /password/gi, 
     /12345678/g, 
     /8675309/g, 
     /[a-z]{8,}/gi, 
     /qwerty/gi, 
     /asdfg/gi, 
     /qazwsx/gi, 
     /zxcvb/gi, 
     /letmein/gi, 
     /trustno1/gi, 
     /omnicloud/gi, 
     /monkey/gi 
    ].some(function(regexp){ 
     return regexp.test(pwd); 
    }); 
} 
0

encontrado esta buscando algo De lo contrario, y como nadie más lo ha mencionado, es necesario mencionarlo. No debe usar listas negras como medio para asegurar contraseñas seguras. Es un agujero de mantenimiento y conduce a contraseñas más malas que simplemente no están en su lista. En su lugar, aplique políticas de contraseñas seguras.

P4ssw0rd! Pasaría muchas políticas fuertes de psuedo pero tardaría unos segundos en descifrar.

La única lista negra efectiva es incluir todas las listas de palabras y combinaciones usadas por las técnicas de descifrado, esto significa que los usuarios esperan minutos/horas/días para verificar si su contraseña es lo suficientemente buena.

Sé que esto no responde a la pregunta específica pero sí trata de consejos sobre lo que es y no es la validación de contraseña eficaz.

Cuestiones relacionadas