创建正则表达式数组Javascript
我想创建一个函数,将密码与一些常见的愚蠢的密码进行比较,这样用户就无法选择其中一个,但是我迄今为止编写的函数,当放在脚本标记之间时,不会导致识别javascript(Firebug)。我认为数组的创建是错误的创建正则表达式数组Javascript,javascript,regex,arrays,passwords,Javascript,Regex,Arrays,Passwords,我想创建一个函数,将密码与一些常见的愚蠢的密码进行比较,这样用户就无法选择其中一个,但是我迄今为止编写的函数,当放在脚本标记之间时,不会导致识别javascript(Firebug)。我认为数组的创建是错误的 function unacceptable(pwd){ var unforgivable = [ /password/gi, /*g matches any occurance of sequence, i checks case insensitive*/ /12
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){
var不可原谅=[
/password/gi,/*g匹配任何序列,我检查不区分大小写*/
/12345678/g,
/8675309/g,
/[a-z]{8,}/gi,
/qwerty/gi,
/asdfg/gi,
/qazwsx/gi,
/zxcvb/gi,
/letmein/gi,
/信托编号1/gi,
/omnicloud/gi,
/猴子/gi];
对于(var i=0;i您有一个尾随逗号。您不能在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
)
您不需要循环来测试每个单词,因为您可以将它们全部放在一个正则表达式中(由|
字符分隔),并让正则表达式引擎一次查找其中任何一个。您可以这样做:
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);
}
在此进行工作演示:
另外,你不必把所有的单词都放在一个数组中。你可以预先声明整个正则表达式,但我认为这样把它们放在数组中会使代码更可读,更易于维护
也可能是这样的:
var unforgivable = /password|12345678|8675309|[a-z]{8,}|qwerty|asdfg|qazwsx|zxcvb|letmein|trustno1|omnicloud|monkey/i;
function unacceptable(pwd){
return unforgivable.test(pwd);
}
我喜欢使用,它将在一个返回值为true时停止遍历数组:
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);
});
}
发现此内容是为了寻找其他内容,因为没有其他人提到过,所以需要提及。您不应使用黑名单作为确保强密码的手段。这是一个维护漏洞,会导致更多不在您列表中的坏密码。请改为强制执行强密码策略
P4ssw0rd!将通过许多伪强策略,但需要几秒钟才能破解
唯一有效的黑名单是包含解密技术使用的所有单词列表和组合脚本,这意味着用户需要等待几分钟/小时/天来验证他们的密码是否足够好
我知道这并没有回答具体的问题,但它确实试图建议什么是有效的密码验证,什么不是有效的密码验证。更正:您不能在ES3中使用尾随逗号。这是从ES5开始允许的。我的错-这对数组/对象文字(他可能应该使用)是正确的,而不是对函数调用。使用[]创建数组,pwd.match(ptrn)对于匹配正则表达式,缺少for循环(),循环中的ptrn将是数组索引,而不是值,您可能应该切换到常规的for循环或添加hasOwnProperty检查,并在函数外部创建正则表达式数组,而不是每次调用函数时都重新创建它。此外,g标志在这里非常无用。@shesek I修复了循环,但它说匹配不是methodI不知道即使是空字符串也是一个好密码。我同意可读性,这就是为什么我将它们放在数组中。我遇到了pwd没有匹配方法的问题,但调用toString()
解决了这个问题。感谢您的帮助!从.match()
切换到.test()
此处哪个更合适。