От автора: один мой товарищ, чтоб не забыть пароли, набивает их себе на тело в виде татуировок. Из-за увеличения числа аккаунтов на различных ресурсах количество наколок резко возросло. Теперь он подумывает о том, как бы часть паролей «перенести» на кожу домашнего кота. Я не сторонник таких «экстремальных мер», поэтому предлагаю рассмотреть, как реализовать в PHP восстановление пароля более гуманным путем.
Способы вернуть утраченное
Давайте сразу разберемся, как на ресурсах, написанных на PHP, происходит авторизация и регистрация. В данном процессе участвуют (чаще всего) база данных MySQL и формы HTML. Рассмотрим весь процесс на примере авторизации.
Пользователь, чтобы зайти в админку ресурса или получить доступ к определенному контенту или функционалу, вводит в форму авторизации свой пароль и логин. В качестве логина может использоваться контактный почтовый ящик, указанный во время регистрации или обычный ник.
После нажатия на кнопку формы Submit введенные данные отправляются на обработку на сервер. Здесь код PHP проверяет правильность пароля и логина. Если они валидны, то пользователь получает доступ к чему-то из перечисленного выше (все зависит от специфики конкретного ресурса).
Но сейчас развелось столько ресурсов, что для сохранения паролей к ним придется покрыть наколками всех членов семейства. Еще и соседям достанется :). Но мы остановимся на изучении более стандартного способа восстановления пароля на сайте.
Для этого также используется связка «PHP-БД-форма». В современных формах авторизации возле основной кнопки или после неправильного ввода пароля выводится специальная ссылка, по которой можно перейти на страницу восстановления утраченного вследствие «амнезии» пароля.
Если вы используете одну из популярных CMS, написанных на PHP, то вам повезло. Чаще всего функционал этих движков включает в себя средства для возврата забытого пароля, поэтому «заморачиваться» на написание отдельного скрипта вам не придется.
Кодируем для «самопальных» движков
Не все предпочитают развертывать свои ресурсы на основе «раскрученных» CMS. Многие компании заказывают эксклюзивные решения с уникальным дизайном и системой. Да и обычные «юзеры» тоже не прочь нанять фрилансера и получить хороший движок, безопасность и уникальность которого намного выше популярных растиражированных решений. В общем, постараемся написать скрипт для восстановления пароля PHP самостоятельно.
Сначала «набросаем» легкую HTML-структуру специальной формы. Я специально не буду указывать стили для нее, чтобы не отвлекаться на описание кода CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<head> <title>Страница восстановления пароля</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <div> <div> <p><b>Восстановление пароля</b></p> </div> <div> <form name="form1" method="post" action="vosst_pass.php"> <p><i>Логин </i><input type="text" name="username" size="30" /></p> <p> <input type="submit" value="Восстановление" size="30"> </p> </form> </div> </div> </body> </html> |
Вот так эта форма выглядит в окне браузера:
Как видите, ничего интересного. Но вся суть кроется в коде PHP. Обратите внимание, что в атрибуте формы action нужно подключить файл, содержащий в себе программный код. Теперь перейдем к его описанию.
Код PHP
Перед этим следует создать БД, где будут храниться логины, пароли и контактное «мыло» пользователей. Для этого я использовал оболочку phpMyAdмin. Структура данных таблицы, куда записывается вся пользовательская информация:
Часть кода, с помощью которого мы коннектимся к MySQL. А также очищаем строку, полученную через текстовое поле формы от специальных символов. Для экранирования используется функция mysqli_real_escape_string():
1 2 |
$connect=mysqli_connect('localhost', 'root', '', 'user_site'); $username = mysqli_real_escape_string($connect,$_POST['username']); |
Затем проверяем наличие пользователя с таким логином в таблице table1. Если находим его, то генерируем с помощью функции shuffle() новый пароль из значений элементов массива $simv[]. После чего «апдейтим» значение столбца с паролем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$zapros = "SELECT `id` FROM `table1` WHERE `name`='{$username}' LIMIT 1"; $sql = mysqli_query($connect,$zapros) or die(mysqli_error()); if (mysqli_num_rows($sql)==1) { $simv = array ("92", "83", "7", "66", "45", "4", "36", "22", "1", "0", "k", "l", "m", "n", "o", "p", "q", "1r", "3s", "a", "b", "c", "d", "5e", "f", "g", "h", "i", "j6", "t", "u", "v9", "w", "x5", "6y", "z5"); for ($k = 0; $k < 8; $k++) { shuffle ($simv); $string = $string.$simv[1]; } $zapros = "UPDATE `table1`SET `pass`='{$string}' WHERE `name`='{$username}' "; $sql = mysqli_query($connect,$zapros) or die(mysqli_error()); |
Восстановление пароля на сайте PHP продолжим с выборки из БД нового значения и отправки его на указанный при регистрации почтовый ящик. После чего сообщим пользователю, что ему следует проверить свое «мыло»:
1 2 3 4 5 6 7 |
$zapros = "SELECT `email` FROM `table1` WHERE `name`='{$username}' LIMIT 1"; $sql = mysqli_query($connect,$zapros)or die(mysqli_error()); $r = mysqli_fetch_assoc($sql); $mail = $r['email']; mail($mail, "Запрос на восстановление пароля", "Hello, $username. Your new password: $string"); } echo "На ваш почтовый ящик было отправлено письмо с новый паролем"; |
Проверка в действии
Теперь проверим работоспособность написанного скрипта. Сначала создадим одну пользовательскую запись в базе. Затем введем логин юзера в форму и отошлем данные на сервер. После этого проверим почтовый ящик. Как видим, сообщение со значением нового пароля было отослано на «мыло».
Затем заглянем в таблицу. Мы видим, что значение пароля в соответствующем столбце обновилось. Значит, созданная нами программа работает корректно.
Так что существует лучшее решение сохранения и восстановления пароля, чем покрывать бедное животное татуировками. Надеюсь, мой товарищ это поймет :).
Комментарии (5)