【问题标题】:ASP.NET Regular Expression Validator (Password Strength)ASP.NET 正则表达式验证器(密码强度)
【发布时间】:2010-09-16 23:19:35
【问题描述】:

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

(?=(.*\\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,}).*$"

重要的部分是长度为 first 的 (?.{x,})。

【问题讨论】:

    标签: javascript asp.net regex validation


    【解决方案1】:

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

    【讨论】:

    • 不好。然后他需要再次验证服务器端并维护两次逻辑。
    • 您确实应该在服务器端进行验证,而不管客户端验证可能已经完成。无法保证客户端会执行您认为应该做的任何事情(浏览器可能禁用了 javascript,客户端甚至可能不是浏览器。)。
    【解决方案2】:

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

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

    另外,\w 包括 \d。如果您只想要 alpha,您可以选择 [^\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 */ }
    

    Edit2:问题的最新更新几乎使我的整个答案无效。 ^^;;

    如果您将模式替换为原来的模式,您最终应该仍然可以使用 JavaScript 代码。

    Edit3:好的。现在我明白你的意思了。

    /^(?=.*[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
    【解决方案3】:

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

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

    【讨论】:

    • 哈哈,我同意 :P 存在 0 是因为它是在服务器端设置的(它是最小值,而不是“你可以有 0 个非字母数字”)
    • 使用非字母数字字符如何降低密码的安全性?
    • [Reread] ".. 我拒绝向你展示如何允许用户使用非字母数字字符"
    猜你喜欢
    • 2016-12-17
    • 2013-03-18
    • 2022-12-03
    • 2016-10-03
    • 1970-01-01
    • 2011-05-06
    • 2016-10-19
    相关资源
    最近更新 更多