PHP password_verify () не работает с базой данных

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

<?php session_start(); //start the session for user profile page define('DB_HOST','localhost'); define('DB_NAME','test'); //name of database define('DB_USER','root'); //mysql user define('DB_PASSWORD',''); //mysql password $con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die(mysqli_connect_error()); $db = mysqli_select_db($con,DB_NAME) or die(mysqli_connect_error()); /* $ID = $_POST['user']; $Password = $_POST['pass']; */ function SignIn(mysqli $con){ $user = mysqli_real_escape_string($con,$_POST['user']); //user input field from html $pass = mysqli_real_escape_string($con,$_POST['pass']); //pass input field from html //$user = $_POST['user']; //$pass = $_POST['pass']; if(isset($_POST['user'])){ //checking the 'user' name which is from Sign-in.html, is it empty or have some text $query = mysqli_query($con,"SELECT * FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysqli_connect_error()); $row = mysqli_fetch_array($query); //or die(mysqli_error($con)); $username = $row['userName']; $pw = $row['pass'];//hashed password in database //check username and password hash echo $pw; //THIS PRINTS OUT NOTHING!!! if($user==$username && password_verify($pass, $pw)) { // $user and $pass are from POST // $username and $pw are from the rows //$_SESSION['userName'] = $row['pass']; echo "Successfully logged in."; } else { echo "Invalid."; } } else{ echo "INVALID LOGIN"; } } if(isset($_POST['submit'])){ SignIn($con); } ?> 

Таким образом, вышеприведенный код будет эхом «Недопустимый», когда я попытаюсь сравнить введенный текстовый пароль и хешированный в базе данных. Echo $ pw не выдает ничего по неизвестной причине.

Вот скрипт регистрации php:

 <?php //Connection Config define('DB_HOST','localhost'); define('DB_NAME','test'); //name of database define('DB_USER','root'); //mysql user define('DB_PASSWORD',''); //mysql password $con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die(mysqli_connect_error()); $db = mysqli_select_db($con,DB_NAME) or die(mysqli_connect_error()); //Registration function Register($con){ if(isset($_POST['user']) && isset($_POST['pass'])){ $username = $_POST['user']; $email = $_POST['email']; $password = $_POST['pass']; //Hashing of password $hpassword = password_hash($password, PASSWORD_DEFAULT); $query = mysqli_query($con,"INSERT INTO UserName (UserNameID,userName, pass, email) VALUES ('2','$username','$hpassword','$email') ") or die(mysqli_connect_error()); if($query){ //Query successful echo "User has been created successfully"; }else{ echo "Error1"; } }else{ echo "Error2"; } } if(isset($_POST['submit'])){ Register($con); } ?> 

Я убедился, что столбец varchar (255) и достаточно длинный. Кто-нибудь знает, почему проверка не удается? Благодаря!

Примечание. После хеширования пароля я планирую добавить защиту от SQL-инъекций.

Related of "PHP password_verify () не работает с базой данных"

Вы вставляете хешированный пароль, это хорошо. Но тогда при входе в систему вы сравниваете строку в строке POST с хешированной версией в базе данных. Логично, что они не будут одинаковыми. Вы должны изменить:

 SELECT * FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'" 

в

 SELECT * FROM UserName where userName = '$_POST[user]' 

И действительно, вы должны добавить защиту от SQL-инъекции повсюду. Предпочтительно использовать подготовленные операторы для каждого выбора, вставки, обновления, удаления и т. Д. И для каждого значения, которое вы используете в этих операторах.