Аутентификация входа с помощью bcrypt

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

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

<?php 

if (isset($_POST['login'])) {
    $user  = mysqli_real_escape_string($_POST['email']);
    $pass  = mysqli_real_escape_string($_POST['password']); //input entered
    $dpass = password_hash('$pass', PASSWORD_DEFAULT)."\n";
    echo $dpass;
    
    $query   = mysqli_query($conn, "SELECT * FROM users WHERE `email` = '$user' AND `password` ='$pass'");
    $numrows = mysqli_num_rows($query);

    if ($numrows != 0) {
        while ($row = mysqli_fetch_assoc($query)) {
            $dbemail    = $row['email'];
            $dbpassword = $row['password'];
        }
        if ($user === $dbemail && password_verify($pass, $dbpassword)) {
            session_start();
            $_SESSION['email'] = $username;
            // Redirect Browser
            header("Location:mentor.php");
        }
    } else {
        echo "<div class='alert alert-danger alert-dismissible'>
            <a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>
            <strong>Warning!</strong> Invalid credentials.
        </div>";
    }
}

?>

person Chima    schedule 05.09.2020    source источник
comment
$user === $dbemail бесполезно (вы уже проверяете это условие в своем запросе) + password ='$pass' также бесполезно в запросе, вы должны удалить это условие из запроса - вам нужно найти строку на основе электронной почты поле отдельно, а затем проверьте, соответствует ли хешированный пароль в строке БД паролю, введенному пользователем   -  person Alon Eitan    schedule 05.09.2020
comment
Предупреждение. Вы широко открыты для инъекций SQL и должны использовать параметризованные подготовленные операторы< /b> вместо создания запросов вручную. Они предоставляются PDO или MySQL. Никогда не доверяйте никаким данным! Даже если ваши запросы выполняются только доверенными пользователями, вы все равно рискуете повредить свои данные. Сбежать недостаточно!   -  person Dharman    schedule 05.09.2020
comment
@AlonEitan Я заметил, что каждый раз, когда я отправляю один и тот же код доступа, хэш меняется. В результате он не соответствует тому, что уже хранится в БД. что-то где-то не так, но пока не могу понять.   -  person Chima    schedule 06.09.2020
comment
@Jahswey Не беспокойтесь об этом - каждый раз он должен быть разным, и тот факт, что он каждый раз меняется, делает невозможным его преобразование в фактический пароль :) Но пока вы сравниваете хэш с самим паролем, тогда каждый из созданных хэшей будет соответствовать   -  person Alon Eitan    schedule 06.09.2020


Ответы (2)


После советов из комментариев выше я пришел к тому, что сработало.

 <?php 
                        if(isset($_POST['login'])){
                         $user = mysqli_real_escape_string($conn,$_POST['email']);
                         $pass = mysqli_real_escape_string($conn,$_POST['password']); //input entered

                         $query = mysqli_query($conn, "SELECT * FROM users WHERE `email` = '$user'");
                         $numrows = mysqli_num_rows($query);
                         if($numrows !=0)
                         {
                         while($row = mysqli_fetch_assoc($query))
                         {
                         $dbemail=$row['email'];
                         $dbpassword=$row['password'];
                         }
                         if(password_verify($pass, $dbpassword))
                        {
                         session_start();
                         $_SESSION['email'] = $username;
                         //Redirect Browser
                         
                         }
                         }
                         else
                         {
                        echo "<div class='alert alert-danger alert-dismissible'>
                          <a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>
                          <strong>Warning!</strong> Invalid credentials.
                        </div>";
                         }
                        }?>
person Chima    schedule 06.09.2020

Не уверен, но ты пробовал

password_verify(mysqli_real_escape_string($_POST['password']), $dbpassword)

Я имею в виду, сравните незашифрованный пароль с хэшем. В ларавеле

Hash::check()

также ожидает нехешированный пароль в качестве параметра.

person Flo Espen    schedule 05.09.2020