繁体   English   中英

PHP密码复杂度检查器代码不起作用

[英]PHP password complexity checker code not working

我有以下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

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

因此,我对为什么我的代码无法正常工作感到困惑。 有人可以帮忙吗?

谢谢布拉德

  1. 更改preg_match_allpreg_match
  2. 在特殊字符正则表达式中,您有几个无法转义的正则表达式字符。 在这里可以避免:/[ /[\\!@#\\$%\\^&\\*\\(\\)-_=+\\{\\};:,<\\.>]/ ^& /[\\!@#\\$%\\^&\\*\\(\\)-_=+\\{\\};:,<\\.>]/ \\( /[\\!@#\\$%\\^&\\*\\(\\)-_=+\\{\\};:,<\\.>]/ )-_= /[\\!@#\\$%\\^&\\*\\(\\)-_=+\\{\\};:,<\\.>]/ };:,< /[\\!@#\\$%\\^&\\*\\(\\)-_=+\\{\\};:,<\\.>]/

不能保证那是问题的100%...

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

我得到了很多这样的东西:

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";
    }

}

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

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

我建议您增加error_reporting和/或激活display_errors和/或错误日志记录。 如果有的话,这是因为它会抛出E_WARNING错误而被捕获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM