Код проверки сложности пароля PHP не работает - PullRequest
2 голосов
/ 18 декабря 2010

У меня есть следующий код 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 нижний регистрpw
Пароль не содержит достаточных цифр: service@domain.com 8B_dip + 3
Пароль не содержитсодержать заглавные буквы: barry@domain.com Barrywidg @ t1o

(Кстати, пароли выше НЕ являются реальными. Я просто поменял строчные буквы на другие строчные буквы и заглавные буквы на другиезаглавные буквы и цифры для других чисел.)

Так что я озадачен тем, почему мой код не работает.Кто-нибудь еще может помочь?

Спасибо, Брэд

Ответы [ 3 ]

4 голосов
/ 18 декабря 2010
  1. Изменить preg_match_all на preg_match.
  2. В регулярном выражении вашего специального символа есть несколько символов регулярного выражения, которые не экранированы Вот оно: /[\!@#\$%\^&\*\(\)-_=+\{\};:,<\.>]/

Нет гарантии, что это 100% проблемы, хотя ...

2 голосов
/ 18 декабря 2010

после преобразования вашего примера в автономный код (пожалуйста, опубликуйте это в будущем)

Я получаю кучу таких:

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

Возможно, вам следует включитьup сообщение об ошибке.

Я предполагаю, что поскольку вы использовали _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";
    }

}
1 голос
/ 18 декабря 2010

preg_match_all принимает три параметра, а не два: третий является ссылкой на массив, который будет заполнен совпадениями.Используйте preg_match.

Также убедитесь, что эти специальные символы экранированы, если они являются частью синтаксиса PCRE (например: \. вместо .).

Я предлагаю вамувеличить error_reporting и / или активировать display_errors и / или регистрировать ошибки.Если бы вы это сделали, это то, что было бы поймано, так как выдает ошибку E_WARNING.

...