ASP.NET正则表达式验证器(密码强度)

10

我有一个验证控件,其表达式如下:

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

这是一个密码,至少包含2个数字2个字母1个非字母数字字符,并且最少8个字符。不幸的是,这似乎不符合跨浏览器的规范。

在Firefox中,此验证功能完美运行,但在Internet Explorer中却不行。

每个答案的组合结果为:

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,}).*$"

关键在于首先设定长度为(?.{x,})。

3个回答

15

(?=(.*\W.*){0,}) 不是指 0 个非字母数字字符。它至少有 0 个非字母数字字符。如果您想使密码不包含任何非字母数字字符,可以使用 (?!.*\W)(?=\w*$)

一个更简单的解决方案是跳过 \W 的前瞻,而使用 \w{8,} 代替 .{8,}

另外,\w 包括 \d。如果您只想要字母,则可以使用 [^\W\d][A-Za-z]

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

这将验证密码至少包含两个数字两个字母,长度至少为8个字符,并且只包含字母数字字符(包括下划线)。
  • \w = [A-Za-z0-9_]
  • \d = [0-9]
  • \s = [ \t\n\r\f\v]
编辑: 要在所有浏览器中使用此功能,您可能需要执行以下操作:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }

编辑2: 问题最近的更新几乎使我的整个答案失效了。 ^^;;

如果您将模式替换为最初的内容,则仍应能够在最终使用JavaScript代码。

编辑3: 好的,现在我知道你的意思了。

/^(?=.*[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

在Internet Explorer中,(?= )似乎并不是零宽度的。

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

Edit4: 更多阅读:http://blog.stevenlevithan.com/archives/regex-lookahead-bug

我认为这可以解决你的问题:

/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")
(?=.{8,}$) 需要放在第一位。

是的,我在你发布之前就看到了,测试过了,它可以工作:D - nyxtom

1

以下方法可以帮您得到2个数字、2个字母,并且密码长度至少为8个字符……但我拒绝向您展示如何防止用户在密码中使用非字母数字字符,为什么一些网站要强制执行不安全的密码策略呢?

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

哈哈,我同意 :P 0 的存在是因为它是在服务器端设置的(它是一个最小值,而不是“你可以有0个非字母数字字符”的限制)。 - nyxtom
非字母数字字符如何使密码不够安全? - Ben Doom
“重新阅读一下”:“我拒绝向您展示如何允许用户使用非字母数字字符”。 - nyxtom

-3

不好。那他需要再次在服务器端进行验证并维护两次逻辑。 - Joel Coehoorn
2
无论客户端验证已完成多少,您都应该在服务器端进行验证。没有保证客户端做了任何你认为它应该做的事情(浏览器可能已禁用 JavaScript,客户端甚至可能不是浏览器)。 - marcj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接