Смену пароля нельзя просто сделать в личном кабинете. Дело в том, что пользователь может оставить свой компьютер без присмотра (например, в офисе), будучи авторизованным на нашем сайте. В этом случае, если разрешить просто менять пароль, то злоумышленник-недоброжелатель сможет сменить пароль на другой, что, конечно же, очень плохо.
Необходимо сделать так, чтобы смена пароля на новый требовала ввода старого пароля.
Давайте реализуем страницу changePassword.php
,
зайдя на которую пользователь увидит форму
с двумя инпутами - в первый он должен будет
ввести свой старый пароль, а во вторую - новый:
<form action="" method="POST">
<input name="old_password">
<input name="new_password">
<input type="submit" name="submit">
</form>
По нажатию на кнопку отправки мы должны сделать следующее:
<?php
$id = $_SESSION['id']; // id юзера из сессии
$query = "SELECT * FROM users WHERE id='$id'";
$result = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($result);
$hash = $user['password']; // соленый пароль из БД
$oldPassword = $_POST['old_password'];
$newPassword = $_POST['new_password'];
// Проверяем соответствие хеша из базы введенному старому паролю
if (password_verify($oldPassword, $hash)) {
$newPasswordHash = password_hash($newPassword, PASSWORD_DEFAULT);
$query = "UPDATE users SET password='$newPasswordHash' WHERE id='$id'";
mysqli_query($link, $query);
} else {
// старый пароль введен неверно, выведем сообщение
}
?>
Реализуйте описанную смену пароля.
Подтверждение пароля
Есть еще один нюанс: старый и новый пароли
следует вводить в инпуты с типом password
.
Получается, что пользователь не будет видеть,
что именно он ввел вместо нового пароля,
что чревато ошибками. Необходимо сделать
так, чтобы для нового пароля вводился сам
пароль и его подтверждение:
<form action="" method="POST">
<input type="password" name="old_password">
<input type="password" name="new_password">
<input type="password" name="new_password_confirm">
<input type="submit" name="submit">
</form>
Реализуйте подтвержедние пароля при его смене.