Мой скрипт регистрации принимает пароль пользователя, а затем использует функцию password_hash PHP для шифрования пароля, а затем помещает его в базу данных. Когда я перехожу к логину с использованием только что созданного пользователя, я получаю ошибку, которая проверяет, совпадают ли пароли или нет. В моем случае это не так. Что я делаю неправильно, когда я делаю вызов функции password_verify в сценарии входа?
РЕГИСТР
if($_SERVER["REQUEST_METHOD"] == "POST"){ function secure($data){ $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return($data); } $p_num = secure($_POST["p_number"]); $first_name = secure($_POST["first_name"]); $last_name = secure($_POST["last_name"]); $email = secure($_POST["email"]); $password = secure($_POST["pw"]); $verify_password = secure($_POST["pw_verify"]); $program = secure($_POST["program"]); $role = secure($_POST["role"]); $logged_in = 0; $registered = 0; $image = "../images/profile_placeholder.png"; if($password != $verify_password){ echo "Nope. Passwords"; } else{ $registered = 1; $password = password_hash($password, PASSWORD_DEFAULT); $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')"; $query = mysqli_query($connect, $insert); echo "Success!"; } }
АВТОРИЗОВАТЬСЯ
if($_SERVER["REQUEST_METHOD"] == "POST"){ $p_num = $_POST["username"]; $pwd = $_POST["password"]; $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'"; $result = mysqli_query($connect, $query); while($row = mysqli_fetch_assoc($result)){ $user_id = "{$row['user_id']}"; $first_name = "{$row['first_name']}"; $last_name = "{$row['last_name']}"; $user_name = $first_name ." " .$last_name; $password = "{$row['password']}"; $image = "{$row['image']}"; $email = "{$row['email']}"; $program = "{$row['program']}"; $role = "{$row['role']}"; $status = "{$row['logged_in']}"; $registered = "{$row['registered']}"; if(($user_id == $p_num) && (password_verify($pwd, $password))){ $_SESSION["id"] = $user_id; $_SESSION["user"] = $user_name; $_SESSION["program"] = $program; $_SESSION["pass"] = $password; $_SESSION["image"] = $image; $_SESSION["email"] = $email; $_SESSION["role"] = $role; $_SESSION["status"] = $status; $_SESSION["registered"] = $registered; $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'"; } var_dump($pwd); var_dump($password); }
Вот что я получаю, когда я делаю var_dump:
string(1) "1" string(16) "$2y$10$0aysCso3b"
Настолько ясно, что пароли не совпадают. Итак, в скрипте регистрации пароль хэшируется и отправляется в базу данных. Затем, когда пользователь переходит к логину, сценарий входа в систему проверяет пароль, введенный пользователем для входа в систему, а затем проверяет его на хешированный пароль в базе данных с помощью password_verify. Тем не менее, хешированный пароль не принимает недопустимый пароль в качестве совпадения. Почему я не понимаю, почему?
Вот что я использую для password_hash
и password_verify
. Попробуйте это, как написано, после этого вы можете начать добавлять остальную часть своего кода.
Измените имена таблиц и столбцов.
NB: Это базовый метод вставки. Я предлагаю вам вместо этого использовать подготовленные инструкции .
Sidenote: колонка пароля должна быть достаточно длинной, чтобы разместить хэш VARCHAR(255)
. Обратитесь к «Сноскам».
INSERT файл
<?php $DB_HOST = 'xxx'; $DB_USER = 'xxx'; $DB_PASS = 'xxx'; $DB_NAME = 'xxx'; $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); if($conn->connect_errno > 0) { die('Connection failed [' . $conn->connect_error . ']'); } $password = "rasmuslerdorf"; $first_name = "john"; $password = password_hash($password, PASSWORD_DEFAULT); $sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')"; $query = mysqli_query($conn, $sql); if($query) { echo "Success!"; } else{ // echo "Error"; die('There was an error running the query [' . $conn->error . ']'); }
Файл LOGIN
<?php // session_start(); $DB_HOST = 'xxx'; $DB_USER = 'xxx'; $DB_PASS = 'xxx'; $DB_NAME = 'xxx'; $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); if($conn->connect_errno > 0) { die('Connection failed [' . $conn->connect_error . ']'); } $pwd = "rasmuslerdorf"; $first_name = "john"; //$sql = "SELECT * FROM users WHERE id = 1"; $sql = "SELECT * FROM users WHERE name='$first_name'"; $result = $conn->query($sql); if ($result->num_rows === 1) { $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($pwd, $row['password'])) { //Password matches, so create the session // $_SESSION['user'] = $row['user_id']; // header("Location: http://www.example.com/logged_in.php"); echo "Match"; }else{ echo "The username or password do not match"; } } mysqli_close($conn);
Примечания:
Столбец паролей должен быть достаточно длинным, чтобы удерживать хэш. 72 long – это то, что хэш выражает в длине символа, но в руководстве предлагается 255.
Справка:
«Используйте алгоритм bcrypt (по умолчанию, как и для PHP 5.5.0). Обратите внимание, что эта константа со временем изменяется, поскольку новые и более сильные алгоритмы добавляются в PHP. По этой причине длина результата от использования этого идентификатора может измениться поэтому рекомендуется сохранить результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором) ».
Друзья, поскольку мы используем уникальное имя пользователя для входа, поэтому нам нужно получить пароль / данные из базы данных, используя только имя пользователя.
Пример:
<?php $connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong"); if (isset($_POST['submit'])) { extract($_POST); // Get Old Password from Database which is having unique userName $sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'"); $res = mysqli_fetch_array($sqlQuery); $current_password = $res['userPassword']; if (password_verify($enteredPassword, $current_password)) { /* If Password is valid!! */ $_SESSION['id'] = $res['id']; header("location: home.php"); } else { /* If Invalid password Entered */ $alt = "Login Failed! Wrong user ID or Password"; header("location: index.php?m=$alt"); } } ?>
Это работает для меня … Я извлекаю пароль из базы данных и сравниваю с введенным паролем с использованием PHP API, т.е. password_verify ($ signedPassword, $ current_password)