【问题标题】:Creating Array of Regular Expressions Javascript创建正则表达式数组 Javascript
【发布时间】:2012-01-02 16:07:24
【问题描述】:

我想创建一个函数,将密码与一些常见的白痴密码进行比较,这样用户就无法选择其中之一,但是我到目前为止编写的函数,当放在脚本标签之间时,不会导致没有 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;
} 

【问题讨论】:

  • 使用 [] 创建数组,使用 pwd.match(ptrn) 匹配正则表达式,您的 for 循环缺少 (),循环中的 ptrn 将是数组索引,而不是值,您应该可能切换到常规 for 循环或添加 hasOwnProperty 检查
  • 并在函数外部创建正则表达式数组,而不是在每次调用函数时重新创建它。此外,g 标志在这里几乎没用。
  • @shesek 我修复了循环,但它说匹配不是一种方法
  • 不知道连空字符串也是好密码。

标签: javascript regex arrays passwords


【解决方案1】:

您不需要循环来测试每个单词,因为您可以将它们全部放入一个正则表达式(由| 字符分隔)并让正则表达式引擎一次查找其中任何一个。你可以这样做:

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/

附:您不必将所有单词放入数组中。您可以预先声明整个正则表达式,但我认为将它们放在这样的数组中可以使代码更易读,更易于维护。

也可能是这样的:

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

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

【讨论】:

  • 我同意可读性,这就是为什么我将它们放在一个数组中。我遇到了 pwd 没有匹配方法的问题,但是在它上面调用 toString() 可以解决这个问题。感谢您的帮助!
  • .match()切换到.test(),这里更合适。
【解决方案2】:

我喜欢使用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);
    });
}

【讨论】:

    【解决方案3】:

    您有一个尾随逗号。您不能在 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
    )
    

    【讨论】:

    • 更正:您不能在 ES3 中使用尾随逗号。从 ES5 开始就允许了。
    • 我的错 - 对于数组/对象文字(他可能应该使用)是这样,而不是函数调用。
    【解决方案4】:

    发现这个正在寻找其他东西,因为没有其他人提到它,所以需要提及。您不应该使用黑名单作为确保强密码的手段。这是一个维护漏洞,会导致更多错误密码不在您的列表中。改为强制执行强密码策略。

    P4ssw0rd!会通过许多伪强策略,但需要几秒钟才能破解。

    唯一有效的黑名单是包括解密技术使用的所有单词列表和组合脚本,这意味着用户等待几分钟/几小时/几天来验证他们的密码是否足够好。

    我知道这并不能回答具体问题,但它确实会尝试就什么是有效的密码验证和无效的密码验证提供建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多