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

ASP.NET Regular Expression Validator (Password Strength)

提问人:nyxtom 提问时间:10/14/2008 最后编辑:Peter Mortensennyxtom 更新时间:8/26/2013 访问量:31279

问:

我有一个验证控件,它具有以下表达式:

(?=(.*\\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,})首先是长度。

JavaScript asp.net 正则表达式 验证

评论


答:

-3赞 David Laing 10/14/2008 #1

现有的基于jQuery的密码强度验证器之一怎么样 - 例如:http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html

评论

0赞 Joel Coehoorn 10/14/2008
白搭。然后,他需要再次在服务器端验证并维护逻辑两次。
2赞 marcj 10/14/2008
您确实应该在服务器端进行验证,而不管客户端验证可能已完成。不能保证客户端做了你认为应该做的任何事情(浏览器可能禁用了javascript,客户端甚至可能不是浏览器。
15赞 Markus Jarderot 10/14/2008 #2

(?=(.*\W.*){0,})不是 0 个非字母数字字符。它至少为 0 个非字母数字字符。如果您希望密码不包含任何非字母数字字符,则可以执行 或 .(?!.*\W)(?=\w*$)

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

此外,还包括 .如果你只想要 alpha,你可以做 or .\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

编辑4:更多阅读: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,}$)

评论

0赞 nyxtom 10/14/2008
是的,我在您发布、测试之前就看到了这一点,它:D
1赞 sontek 10/14/2008 #3

这将为您提供 2 分钟数字、2 分钟字符和最少 8 个字符长度......我拒绝向您展示如何不允许用户在其密码中使用非字母数字字符,为什么网站想要强制执行安全性较低的密码?

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

评论

0赞 nyxtom 10/14/2008
哈哈,我同意:P0 之所以存在,是因为它是在服务器端设置的(它是最小值,而不是“您可以有 0 个非字母数字”)
0赞 Ben Doom 10/14/2008
使用非字母数字字符如何降低密码的安全性?
0赞 nyxtom 10/14/2008
[重读]"..我拒绝向您展示如何不允许用户使用非字母数字字符”