Я проверил различные похожие отчеты, но не смог найти решения, поэтому буду благодарен за любую помощь.

Я пытаюсь создать форму регистрации / входа в PHP. Вроде все работает нормально, кроме проверки пароля. Вот часть кода, в которой имя пользователя и пароль определяются и запрашиваются из базы данных для проверки:

    $username = $_POST['username'];
    $pwd = $_POST['pwd'];
....
....
....
    else{
            $sql = "SELECT * FROM users WHERE username=?;";
            $stmt = mysqli_stmt_init($conn);
            if(!mysqli_stmt_prepare($stmt, $sql)){
              echo "MySQL Error!";
              exit();
            }
             else{
               mysqli_stmt_bind_param($stmt, 's', $username);
               mysqli_stmt_execute($stmt);
               $result= mysqli_stmt_get_result($stmt);
               if ($row = mysqli_fetch_assoc($result)) {
                 $pwdCheck = password_verify($pwd, $row['password']);
                 if($pwdCheck == false){
                 header("Location: ../login.php?error=wrongpassword");
                 exit();
                }
                else if($pwdCheck == true){
                session_start();
                $_SESSION['userId'] = $row['id'];
                $_SESSION['username'] = $row['username'];
                header ("Location: ../login.php?login=success");
                exit();
               }

Вот некоторые вещи, которые следует принять во внимание:

  1. Я установил таблицу паролей в базе данных на LONGTEXT и varchar (250) - все равно не повезло.

  2. Вот результат работы var_dump ($ pwdCheck, $ pwd, $ row ['password'])

    bool (false) string (8) "testtest" string (60) "$ 2y $ 10 $ nSMyRdh5RcjlKu.vaQMLHeRjmfYTqkjjdnM7HI4Di / 294EBCpE1JG"

Он возвращает bool (false), в то время как «testtest» - это правильный пароль, а строка, отображаемая var_dump, является правильным хешем из таблицы базы данных паролей. Так что я действительно не уверен, что здесь пошло не так.

Вот как хешируется пароль (обратите внимание, что это делается в отдельном скрипте PHP, не уверен, что это имеет значение)

else{

$sql = "INSERT INTO users (username, mailuid, password, managername, teamname) VALUES (?,?,?,?,?)";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)){
echo "MySQL Error";
}
else{
$hashpwd = password_hash($password, PASSWORD_DEFAULT);
mysqli_stmt_bind_param($stmt, "sssss", $username, $mailuid, $hashpwd, $managername, $teamname);
mysqli_stmt_execute($stmt);
  header("Location: ../signup.php?signup=success");
exit();
}

Все остальное работает как положено. Например, имя пользователя успешно извлекается из БД (таблица имен пользователей). Похоже, что хешированный проход также извлекается из таблицы базы данных паролей, но проверка все равно не выполняется.

1
the_arsenal_bg 16 Окт 2020 в 22:16

1 ответ

Лучший ответ

Я создал простую суть, где вы можете увидеть версию своего кода, которую мне удалось запустился правильно и получил правильные результаты:

  • пользователь может зарегистрироваться
  • пользователь может войти в систему
  • пользователь может выйти

Я считаю, что ваш код был правильным, в общих чертах, но я также считаю, что вы, должно быть, перепутали некоторые свои переменные и имена полей.

В вашем вопросе вы выполняете var_dump из $row['pwdUsers'], поля, которое никогда не было в операторе вставки. Вы также выбираете поле username при выборке данных для сравнения с тем, которое было отправлено для входа в систему, но в операторе вставки переменная, которую вы вставляете в это поле, называется $mailuid (в то время как переменная {{X4} } сидит рядом).

Учитывая, что при извлечении и применении в контролируемой среде ваш код работает, я готов поспорить, что ваша ошибка связана с возможной путаницей, вызванной ранее упомянутыми сбивающими с толку номенклатурами, или из-за некоторой другой логики, скрытой от нас в предоставленных вами фрагментах .

1
lucasreta 16 Окт 2020 в 23:28