【问题标题】:ASP.net PasswordStrengthRegularExpression to prevent common passwords like "11111" or "123456"ASP.net PasswordStrengthRegularExpression 防止常见密码,如“11111”或“123456”
【发布时间】:2011-02-28 21:25:41
【问题描述】:

一位客户要求我阻止用户输入常用密码,但允许他们仅使用字母数字密码。

您知道在内置PasswordStrengthRegularExpression 选项中使用的正则表达式吗?

编辑:我知道很模糊,我告诉客户的。定义类似于

  • 不允许同一字符连续出现超过 3 次。(1111、2222 等)
  • 不允许上升或下降趋势(12345、abcde、6543 等)

【问题讨论】:

  • 这是一个非常模糊的要求。如果您需要至少一个字母和一个数字,那么您的示例都不会通过。这对您的客户来说是否足够好?
  • 为什么黑客只允许字母数字字符?
  • @Oded:点赞1111、123456、654321、密码、123456a、a11111等
  • @Marian:不仅允许,而且允许。
  • @Eduardo:区别在哪里?换句话说,有什么理由禁止人们在密码中使用标点符号?

标签: asp.net regex security passwords


【解决方案1】:

这对正则表达式的要求太多了。你可以很容易地覆盖重复的字符:

^(?:(.)(?!\1\1)){6,}$

但禁止连续字符运行的唯一方法是枚举所有可能性:

^(?:(?!123|234|345|456|567|678|789).)*$

...无限。我认为你能做的最好的就是需要复杂的字符类型组合——例如,至少两个大写字母、小写字母和数字:

^(?=(?:[^0-9]*[0-9]){2})
 (?=(?:[^A-Z]*[A-Z]){2})
 (?=(?:[^a-z]*[a-z]){2})
 (?:([A-Za-z0-9])(?!\1\1)){6,}$

这将迫使用户有点创意。

【讨论】:

    【解决方案2】:

    我不确定正则表达式是否可以满足要求,但函数可能更易读。类似下面的内容将消除任何具有三个连续相等字符或三个连续字符遵循 1(字母或数字)的升序或降序模式的内容。

    static bool IsPasswordRelativelyStrong(string input)
    {
        for (int i = 2; i < input.Length; i++)
        {
            if (input[i] == input[i - 1] - 1 && input[i - 1] == input[i - 2] - 1)
                return false;
            else if (input[i] == input[i - 1] + 1 && input[i - 1] == input[i - 2] + 1)
                return false;
            else if (input[i] == input[i - 1] && input[i - 1] == input[i - 2])
                return false;
        }
    
        return true;
    }
    

    所以给定以下数组

    string[] passwords = { "123456", "abcde", "654321", "111223", "11223344" };
    

    只有最后一个通过。可以扩展该功能以考虑您是否允许和/或要求非字母数字字符以及密码是否必须超过最小长度要求。

    【讨论】:

    • 这就是我的想法。只是不想重新发明轮子。谢谢
    【解决方案3】:

    这个怎么样?

    passwordStrengthRegularExpression=" @\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"
    

    验证密码是否满足以下条件:

    • 超过七个字符。
    • 至少包含一位数字。
    • 至少包含一个特殊的 (非字母数字)字符。

    http://msdn.microsoft.com/en-us/library/system.web.security.membership.passwordstrengthregularexpression.aspx

    【讨论】:

    • {1,} 是多余的(甚至可能会减慢速度):您只关心它匹配一次,而不是它消耗尽可能多的匹配副本。此外,您的报价也搞砸了;您的字符串以" @\" 开头,而我认为您的意思是它以@" 开头。
    • Guh,无视这一点——我什至从来没有使用过 C#,我只是回答了一个关于它的正则表达式问题并将它放在大脑中。哇。我的错。
    • 但是关于{1,} 的观点仍然有效。我知道这就是它在文档中的显示方式,但这是错误的。编写这些文档的人的 regex-fu 非常弱。
    【解决方案4】:

    您可以断言最低程度的复杂性; e. G。 “至少一个大写,一个小写字母,一个数字,最小长度6个字符,只能是字母数字字符”可以写成

     ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6,}$
    

    【讨论】:

      【解决方案5】:

      试试这个:

      passwordStrengthRegularExpression="^\S*([a-zA-Z0-9]{1,10})$"
      

      【讨论】:

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