Создание массива регулярных выражений Javascript - PullRequest
25 голосов
/ 21 ноября 2011

Я хочу создать функцию, которая сравнивает пароль с некоторыми обычно идиотскими, так что пользователь не может выбрать один из них, но функция, которую я написал до сих пор, когда помещается между тегами сценария, не вызывает JavaScript для быть признанным (Firebug). Я предполагаю, что создание массива является ошибкой.

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;
} 

Ответы [ 4 ]

44 голосов
/ 21 ноября 2011

Вам не нужен цикл для проверки каждого слова, поскольку вы можете поместить их все в одно регулярное выражение (разделенное символом |) и позволить механизму регулярных выражений искать любое из них сразу.Вы можете сделать это следующим образом:

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);
}

Рабочая демонстрация здесь: http://jsfiddle.net/jfriend00/cyVbC/

PS Вам не нужно помещать все слова в массив.Вы можете просто заранее объявить все регулярные выражения, но я подумал, что помещение их в массив, как это, сделало бы более читабельный код, который было бы проще поддерживать.

12 голосов
/ 01 ноября 2013

Мне нравится использовать Array.some, который прекратит итерацию по массиву, как только вернется одно возвращаемое значение:

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 голосов
/ 26 августа 2016

Нашел это в поисках чего-то другого, и, как никто другой не упомянул об этом, это нужно упомянуть. Вы не должны использовать черные списки как средство обеспечения надежных паролей. Это дыра в обслуживании и приводит к появлению более плохих паролей, которых просто нет в вашем списке. Вместо этого применяйте политики надежных паролей.

P4ssw0rd! будет проходить много сильных политик psuedo, но потребуется несколько секунд, чтобы взломать.

Единственный эффективный черный список - это включение всех списков слов и комбинированных сценариев, используемых методами расшифровки, это означает, что пользователи будут ждать минуты / часы / дни, чтобы проверить, достаточно ли хорош их пароль.

Я знаю, что это не отвечает на конкретный вопрос, но он пытается дать совет относительно того, что является и не является эффективной проверкой пароля.

0 голосов
/ 21 ноября 2011

У вас есть запятая.Вы не можете использовать запятую в 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
)
...