【问题标题】:PHP password complexity checker code not workingPHP密码复杂性检查器代码不起作用
【发布时间】:2010-12-17 21:16:59
【问题描述】:

我有以下 PHP 代码试图检查密码复杂性,但是当我运行它时,我似乎没有得到有效的结果(见下文)

while (odbc_fetch_row($rs)) {

    $r1='/[A-Z]/';  //Uppercase
    $r2='/[a-z]/';  //lowercase
    $r3='/[!@#$%^&*()-_=+{};:,<.>]/';  // whatever you mean by 'special char'
    $r4='/[0-9]/';  //numbers


if (!preg_match_all($r4, odbc_result($rs,"U_password"))) {
    echo "Password doesn't contain numbers: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " .  odbc_result($rs,"U_password") . "<br>\n";
}

if (!preg_match_all($r2, odbc_result($rs,"U_password"))) {
    echo "Password doesn't contain lowercase letters: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " .  odbc_result($rs,"U_password") . "<br>\n";
}

if (!preg_match_all($r1, odbc_result($rs,"U_password"))) {
    echo "Password doesn't contain  uppercase letters: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " .  odbc_result($rs,"U_password") . "<br>\n";
}

}

输出:

密码不包含小写字母:jason@domain.com lowercasepw
密码中的数字不足:service@domain.com 8B_dip+3
密码不包含大写字母:barry@domain.com Barrywidg@t1o

(顺便说一下,上面的密码不是真实的。我只是将小写字母替换为其他小写字母,将大写字母替换为其他大写字母,将数字替换为其他数字。)

所以我很困惑为什么我的代码不起作用。其他人可以帮忙吗?

谢谢 布拉德

【问题讨论】:

    标签: php passwords complexity-theory


    【解决方案1】:
    1. preg_match_all 更改为preg_match
    2. 在您的特殊字符正则表达式中,您有几个未转义的正则表达式字符。在这里它被转义了:/[\!@#\$%\^&amp;\*\(\)-_=+\{\};:,&lt;\.&gt;]/

    虽然不能保证这是 100% 的问题...

    【讨论】:

    • 谢谢 - 好像是这样。
    【解决方案2】:

    将您的示例转换为独立代码后(请在以后发布)

    我得到了一堆这些:

    PHP Warning: preg_match_all() expects at least 3 parameters, 2 given in /Users/cabbey/foo.php on line 9

    您可能应该打开错误报告。

    我假设既然你使用了 _all,你想计算它们,在这种情况下你会想改变你的正则表达式不要太贪心。

    $r1='/[A-Z]{1}/';  //Uppercase
    $r2='/[a-z]{1}/';  //lowercase
    $r3='/[!@#$%^&*()_=+{};:,<.>-]{1}/';  // whatever you mean by 'special char'
    $r4='/[0-9]{1}/';  //numbers
    
    $found = array();
    
    foreach (array('lowercasepw', '8B_dip+3', 'Barrywidg@t1o') as $pass) {
    
        if (!preg_match_all($r4, $pass, $found)) {
            echo "Password doesn't contain numbers: $pass\n";
        } else {
            echo "found ".count($found[0])." numbers\n";
        }
    
        if (!preg_match_all($r2,$pass, $found)) {
            echo "Password doesn't contain lowercase letters: $pass\n";
        } else {
            echo "found ".count($found[0])." lowercase\n";
        }
    
        if (!preg_match_all($r1, $pass, $found)) {
            echo "Password doesn't contain  uppercase letters: $pass\n";
        } else {
            echo "found ".count($found[0])." uppercase\n";
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      preg_match_all 接受三个参数,而不是两个:第三个是对将填充匹配项的数组的引用。使用preg_match

      此外,如果这些特殊字符是 PCRE 语法的一部分,请确保它们被转义(例如:\. 而不是 .)。

      我建议您增加error_reporting 和/或激活display_errors 和/或错误记录。如果你有,这会在它吐出 E_WARNING 错误时被捕获。

      【讨论】:

      • 谢谢,我正在检查 phperror.log 但可能我的日志记录不够高。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2013-01-29
      相关资源
      最近更新 更多