Php как сделать восстановление пароля

Изучайте, как восстановить пароль с помощью PHP: просмотрите примеры и узнайте, как создать форму восстановления, используя сессии, письма и защитные вопросы.

Восстановление пароля в системе с помощью PHP - не слишком сложная задача. Для ее решения достаточно добавить несколько страниц к сайту. Так, на первой странице будет форма восстановления пароля. После заполнения формы пользователю придет письмо с ссылкой для смены пароля. После перехода по ссылке на второй странице появится форма ввода нового пароля. А на третьей странице после успешной смены пароля пользователь получит подтверждение. Таким образом, для восстановления пароля необходимо создать следующие страницы:

Страница с формой восстановления пароля

На данной странице пользователь должен ввести свой email адрес. После этого будет отправлено письмо с ссылкой для смены пароля. Код страницы должен выглядеть следующим образом:

<?php
	// Проверка на отправление формы
	if(isset($_POST['submit'])) {
		// Проверка на заполненность полей
		if(empty($_POST['email'])) {
			$error = 'Введите email адрес';
		} else {
			// Проверка на валидность email адреса
			if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
				$error = 'Неверный email адрес';
			} else {
				// Проверка на существование пользователя с таким email адресом в базе данных
				$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
				$stmt->bind_param("s", $_POST['email']);
				$stmt->execute();
				$result = $stmt->get_result();
				if($result->num_rows > 0) {
					// Проверка на просроченность ссылки для смены пароля
					$user = $result->fetch_assoc();
					if(time() - $user['forgot_password_timestamp'] > 86400) {
						// Генерация случайного хеша
						$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
						$numChars = strlen($chars);
						$string = '';
						for($i = 0; $i < 10; $i++) {
							$string .= substr($chars, rand(1, $numChars) - 1, 1);
						}
						$hash = sha1($string);
						// Запись хеша и времени запроса в базу данных
						$stmt = $db->prepare("UPDATE users SET forgot_password_hash = ?, forgot_password_timestamp = ? WHERE email = ?");
						$stmt->bind_param("sis", $hash, time(), $_POST['email']);
						$stmt->execute();
						// Отправка письма с ссылкой для смены пароля
						$to = $_POST['email'];
						$subject = 'Смена пароля';
						$message = 'Для смены пароля перейдите по ссылке: http://example.com/forgot_password.php?email='.$_POST['email'].'&hash='.$hash;
						$headers = 'From: example@example.com' . "rn" .
						'Reply-To: example@example.com' . "rn" .
						'X-Mailer: PHP/' . phpversion();
						mail($to, $subject, $message, $headers);
					}
					$success = 'На ваш email адрес было отправлено письмо с ссылкой для смены пароля';
				} else {
					$error = 'Пользователь с таким email адресом не найден';
				}
			}
		}
	}
?>

<form action="" method="post">
	<input type="text" name="email" placeholder="Email адрес">
	<input type="submit" name="submit" value="Отправить">
</form>

На этой странице происходит проверка данных введенных пользователем. Если проверка проходит успешно, то происходит генерация случайного хеша. Этот хеш и время запроса записываются в базу данных. Затем происходит отправка письма пользователю со ссылкой для смены пароля.

Страница с формой для смены пароля

На данной странице происходит проверка данных переданных через параметры запроса. Если проверка проходит успешно, то в форме появляется поле для ввода нового пароля. Код страницы должен выглядеть следующим образом:

<?php
	// Проверка на передачу параметров запроса
	if(isset($_GET['email']) && isset($_GET['hash'])) {
		// Проверка на существование пользователя с таким email адресом в базе данных
		$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
		$stmt->bind_param("s", $_GET['email']);
		$stmt->execute();
		$result = $stmt->get_result();
		if($result->num_rows > 0) {
			// Проверка на просроченность ссылки для смены пароля
			$user = $result->fetch_assoc();
			if(time() - $user['forgot_password_timestamp'] > 86400) {
				$error = 'Ссылка для смены пароля устарела';
			} else {
				// Проверка на совпадение хешей
				if($_GET['hash'] == $user['forgot_password_hash']) {
					// Проверка на отправление формы
					if(isset($_POST['submit'])) {
						// Проверка на заполненность полей
						if(empty($_POST['password']) || empty($_POST['password_confirm'])) {
							$error = 'Заполните все поля';
						} else {
							// Проверка на совпадение паролей
							if($_POST['password'] != $_POST['password_confirm']) {
								$error = 'Пароли не совпадают';
							} else {										

Ответы (0)