Я создаю «Забыли пароль?» страница для моего сайта.
Очевидно, что когда новый пользователь создает учетную запись, скрипт php шифрует пароль, выбранный с помощью алгоритма md5.
Теперь все работает нормально, за исключением того, что когда пользователь запрашивает напоминание пароля с помощью страницы «Забыли пароль», полученное им письмо возвращает пароль, зашифрованный в md5, а не реальный.
Ниже приведен код, который я использую.
$query2="SELECT password FROM users WHERE email='$email'";
$risultato2 = mysql_query($query2) or die ($query2);
while ($row = mysql_fetch_array($risultato2))
{
$passToSend = md5($row['password']);
}
echo "<center>We have sent an e-mail to <b>".$email."</b> containing a link to recover your password.</center>";
$mittente = 'From: "My website" <[email protected]> ';
$destinatario = $email;
$oggetto = "Recover your password";
$messaggio = "The password you've choosen during the sign up process is: ".$passToSend."\n\nIf you'd like to change your password, please visit http://www.mywebsite.com/mydashboard/changepwd.php\n\n Please ignore this message if you haven't requested a password reminder.";
mail($destinatario, $oggetto, $messaggio, $mittente);
Что я могу сделать?
Никогда не пытайтесь предоставить функцию, позволяющую людям восстановить свой пароль. Если вы правильно храните пароли, это должно быть невозможно.
Примечание: вы должны хешировать пароли, прежде чем помещать их в базу данных, а не когда вы их извлекаете, а MD5 неподходящий алгоритм хеширования так что вам нужно заботиться лучше паролей ваших пользователей.
Создайте токен, состоящий из случайных символов (сделайте его довольно длинным). Сохраните его в таблице рядом с их идентификатором пользователя (или первичным ключом таблицы пользователей) и отметкой времени. Отправьте пользователю токен по электронной почте (для удобства вставьте его в URL). Когда они перейдут по ссылке, дайте им форму, которая позволит им установить новый пароль для своей учетной записи (который вы можете определить по токену).
Удалите токен после того, как он сбросит свой пароль, он должен быть одноразовым.
Удалить токены, которые не используются после некоторый период времени (например, 24 часа) с работой cron.
Других решений пока нет …