Смена пароля на PHP

Смену пароля нельзя просто сделать в личном кабинете. Дело в том, что пользователь может оставить свой компьютер без присмотра (например, в офисе), будучи авторизованным на нашем сайте. В этом случае, если разрешить просто менять пароль, то злоумышленник-недоброжелатель сможет сменить пароль на другой, что, конечно же, очень плохо.

Необходимо сделать так, чтобы смена пароля на новый требовала ввода старого пароля.

Давайте реализуем страницу 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>

Реализуйте подтвержедние пароля при его смене.