[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сделать востановление пароля?
romul
У меня пароли юзеров хешируються в базу фунцией md5, я знаю, что обратной функции нет, тоесть сам пароль я не могу посмотреть... дак вот как возможно в такой ситуации сделать возможным востановление пароля?



Спустя 2 минуты, 22 секунды (6.11.2009 - 00:45) Soldier Ghost написал(а):
Возможно, сгенерировать->Выслать на мэйл->захэшировать->обновить в базе!
Сгенерировать всмысле новый

Спустя 25 секунд (6.11.2009 - 00:45) glock18 написал(а):
его обычно генерируют в таких ситуациях. охота восстанавливать - надо менять алгоритм шифрования на обратимый.

Спустя 8 минут, 48 секунд (6.11.2009 - 00:54) romul написал(а):
А как поменять алгоритм шифрования на обратимый?

Спустя 52 секунды (6.11.2009 - 00:55) haZe написал(а):
да,можно сгенерить незнаю, там 6 чисел, захэшировать положить в базу и отправить на почту, все равно пользователь зайдет и поменяет опять на свой, который снова забудет)

Спустя 11 минут, 40 секунд (6.11.2009 - 01:06) live Uucyc написал(а):
а можно просто создать временную страничку и отправить ее пользователю, где он и поменяет свой пароль на новый

Спустя 12 минут, 34 секунды (6.11.2009 - 01:19) romul написал(а):
live Uucyc

Почему временную?

Спустя 8 часов, 33 минуты, 29 секунд (6.11.2009 - 09:52) stepan написал(а):
Цитата (romul @ 5.11.2009 - 22:19)
Почему временную?

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

Спустя 3 часа, 59 минут, 59 секунд (6.11.2009 - 13:52) Gabriel написал(а):
stepan
это четож получаеться, если пароль по привычке раз в неделю меняю, то пролетаю как фанера над парижем?

Спустя 4 дня, 12 часов, 12 минут, 58 секунд (11.11.2009 - 02:05) romul написал(а):
А что если не хешировать пароль.. хранить его просто так в базе.. что бы не париться.... как думаете? чем мне это черевато?

Спустя 7 часов, 1 минута, 57 секунд (11.11.2009 - 09:07) eXtent написал(а):
Код немного кривой, Но покапайся смысл поймеш исправиш как надо сам)) wink.gif


<?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset
($login);} } //заносим введенный пользователем логин в переменную $login,
если он пустой, то уничтожаем переменную

if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset
($email);} } //заносим введенный пользователем e-mail, если он пустой, то
уничтожаем переменную

if (isset($login) and isset($email)) {//если существуют необходимые
переменные

include ("blocks/bd.php");// файл соединения с базой

$result = mysql_query("SELECT id FROM users WHERE login='$login' AND
email='
$email'",$db);//такой ли у пользователя е-мейл
$myrow = mysql_fetch_array($result);
if (empty($myrow['id']) or $myrow['id']=='') {
//если активированного пользователя с таким логином и е-mail
адресом нет
exit ("Пользователя с таким e-mail адресом не обнаружено ни в
одной базе smile.gif <a href='index.php'>Главная страница</a>"
);
}
//если пользователь с таким логином и е-мейлом найден, то
необходимо сгенерировать для него случайный пароль, обновить его в базе и
отправить на е-мейл
$datenow = date('YmdHis');//извлекаем дату
$new_password = md5($datenow);// шифруем дату
$new_password = substr($new_password, 2, 6); //извлекаем из шифра
6 символов начиная со второго. Это и будет наш случайный пароль. Далее
запишем его в базу, зашифровав точно так же, как и обычно.

$new_password_sh = strrev(md5($new_password))."b3p6f";//зашифровали
mysql_query("UPDATE users SET password='$new_password_sh' WHERE
login='
$login'",$db);// обновили в базе
//формируем сообщение


$message = "Здравствуйте, ".$login."! Мы сгененриоровали для Вас
пароль, теперь Вы сможете войти на сайт citename.ru, используя его. После
входа желательно его сменить. Пароль:
\n".$new_password;//текст сообщения
mail($email, "Восстановление пароля", $message, "Content-type:text/
plane; Charset=windows-1251
\r\n");//отправляем сообщение

echo "<html><head><meta http-equiv='Refresh' content='5; URL=index.php'></head><body>На Ваш e-mail отправлено письмо с паролем.
Вы будете перемещены через 5 сек. Если не хотите ждать, то <a
href='index.php'>нажмите сюда.</a></body></html>"
;//перенаправляем пользователя
}


else {//если данные еще не введены
echo '
<html>
<head>
</head>
<body>
<p><h2>Забыли пароль?</h2></p>
<form action="#" method="post">
<p>Введите Ваш логин:<br> <input type="text" name="login"></p>
<p>Введите Ваш E-mail: <br><input type="text" name="email"></p>
<p><input type="submit" class="formbutton" name="submit" value="Отправить"></p>
</form>
</body>
</html>'
;
}

?>



Если у тебя пароль просто в md5 без шифровки, то тебе нужно будет изменить
$new_password_sh = strrev(md5($new_password))."b3p6f";//зашифровали
mysql_query("UPDATE users SET password='$new_password_sh' WHERE
login='
$login'",$db);// обновили в базе


Потому что у меня он там шифруется "b3p6f"

Спустя 30 минут, 44 секунды (11.11.2009 - 09:38) Семён написал(а):
Делаешь дополнительную колонку pass_source, т.е. где храниться пароль пользователя. и на случай потери восстанавливаешь из неё.

Спустя 19 минут, 25 секунд (11.11.2009 - 09:57) twin написал(а):
eXtent Да ты я гляжу неуймесси)))
Прекратишь когда нибудь пихать сюда хрень под видом кода?
Это что?

if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset
($login);} } //заносим введенный пользователем логин в переменную $login,
если он пустой, то уничтожаем переменную

if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset
($email);} } //заносим введенный пользователем e-mail, если он пустой, то
уничтожаем переменную

Чего ты тут уничтожаешь? Того, чего небыло никогда? Предварительно к этому "ничего" обратившись?

Дальше что за ересь:
if (isset($login) and isset($email)) {//если существуют необходимые 
переменные
Если я пробел закатаю или апостроф, все в порядке значит?
Вот сюда апостроф и закатаю:

$result = mysql_query("SELECT id FROM users WHERE login='$login' AND
email='
$email'",$db);//такой ли у пользователя е-мейл
потому что ты прямо приглашаешь это сделать. А за одно и всю базу твою стырить и грохнуть потом.
Это что за анахронизм?
$myrow = mysql_fetch_array($result);

Ты сначала почитал бы, что это за функция и для чего она, прежде чем писать что попало.
Это что за хрень:
exit ("Пользователя с таким e-mail адресом не обнаружено ни в
одной базе <a href='index.php'>Главная страница</a>"
);
С какого перепуга юзера экситом пугать взялись? Где дизайн, где корректное указание на ошибку? Что за детсад?
Пароль новый как генерится? Раз в секунду? Да я ведь все акки за пару дней переломаю, ведь это же более чем прогнозируемо.
С мылом ты чего такое вытворяешь там?
echo зачем для html заюзал?

Блин, хватит. Или поправь все или я снесу это безобразие.
Поповщины не потерплю.

Спустя 3 часа, 49 минут, 46 секунд (11.11.2009 - 13:47) ИНСИ написал(а):
twin я бы посоветовал тебе "вежливее" говорить с людьми! Как ты с людьми, так и они к тебе будут относиться!


eXtent быть может сделать так:
в БД в таблице users cделать `password`, `real_password` и в `real_password` при регистрации заносить настоящий пароль. А потом при восстановлении будешь выстаскивать `real_password` =)

а по твоему "висячему" вопросу, код снизу:


// если нет нужных "полей" либо они пустые, то выводим форму
if(!($_POST['email']) || $_POST['email'] = '') {
echo '
<html>
<head></head>

<body>
<p><h2>Забыли пароль?</h2></p>
<form action="" method="post">
<p>Введите Ваш E-mail: <br><input type="text" name="email"></p>
<p><input type="submit" class="formbutton" name="submit" value="Отправить"></p>
</form>
</body>
</html>
'
;
} else {

// обрабатываем данные
$_POST['email'] = mysql_real_escape_string(stripslashes($_POST['email']));

include ("blocks/bd.php");// файл соединения с базой
$result = mysql_query("
SELECT `id`
FROM `users`
WHERE `email` = '
{$_POST['email']}'
LIMIT 1
"
or die(mysql_error()));//такой ли у пользователя е-мейл

// если результат больше 0

if(mysql_num_rows($result) > 0) {
$row = mysql_fetch_assoc($result);
$distinct_password = uniqid();

mysql_query("
UPDATE `users`
SET `password` = '"
.md5($distinct_password)."'
WHERE `email` = '
{$_POST['email']}'
"
or die(mysql_error()));// обновили в базе

//формируем все для сообщения

$eol = '\n';
$charset = 'utf-8';
$from = 'info@mysite.ru';
$subject = "=?utf-8?b?" . base64_encode('Восстановление пароля'). "?=";

$headers = '';
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-type: text/html; charset=\"".$charset."\"" . $eol;
$headers .=
'From: ' . $from . $eol .
'Return-Path: \'' . $from . '\'' .$eol .
'X-Priority: 3' . $eol .
'X-Mailer: My site ' . $eol
;

$message = '
Здравствуйте, '
. $row['login'] . '!
Мы сгененриоровали для Вас пароль, теперь Вы сможете войти на сайт citename.ru, используя его.
После входа желательно его сменить. Пароль:\n'
. $distinct_password;

if(!mail($_POST['email'], $subject, $message, $headers)) die('Ошибка при отправке!')
echo '
<html>
<head>
<meta http-equiv="Refresh" content="5; URL=index.php">
</head>

<body>
На Ваш e-mail отправлено письмо с паролем. Вы будете перемещены через 5 сек. Если не хотите ждать, то
<a href="index.php">нажмите сюда.</a>
</body>
</html>'
;//перенаправляем пользователя

} else {
die('Пользователя с таким e-mail адресом не обнаружено ни в одной базе smile.gif <a href="index.php">Главная страница</a>');
}
}


Спустя 53 минуты, 11 секунд (11.11.2009 - 14:40) romul написал(а):
Семён
Я так и сделал..))

Спустя 2 часа, 2 минуты, 32 секунды (11.11.2009 - 16:43) twin написал(а):
Цитата
Семён
Я так и сделал..))

А зря. Нельзя так к чужой собственности относиться. А пароль - это чужая тайна и чужая собственность. И хранить его в явном виде нельзя.
А хранить рядом с зашифрованным еще и бессмысленно. Зачем вообще тогда его хэшировать?

welbox2
Это кто меня вежливости тут учить собрался? Человек, который тычет пальцем в глаза?

Спустя 4 часа, 5 минут, 24 секунды (11.11.2009 - 20:48) ИНСИ написал(а):
twin если бы я в живую тебя "тычил", другое дело. Фота - фотка! Успокойся уже на счет фотки пожалуйста!!!

Спустя 18 часов, 30 минут, 29 секунд (12.11.2009 - 15:19) romul написал(а):
twin
А почему бессмысленно рядом с зашифрованным хранит?

Спустя 7 минут, 17 секунд (12.11.2009 - 15:26) twin написал(а):
А зачем его вообще шифруют? А для того, что если жулик угонит базу, то не сможет воспользоваться паролями. Человеку свойственно один и тот же пароль использовать на разных ресурсах. Для других сайтов, почты, вебмани... По этому и идет охота за паролями. И порядочный владелец сайта никогда не позволит себе так подставить юзера. Это же ответственность.

Так а какой смысл держать зашифрованный пароль, а рядом открытый? Как минимум это глупо.

Цитата
twin если бы я в живую тебя "тычил", другое дело. Фота - фотка! Успокойся уже на счет фотки пожалуйста!!!

Если бы вживую, я бы и полсекунды с тобой общаться бы не стал. А тут впечатление о человеке складывается по различным вторичным признакам.
И впечатление это очень нелицеприятное в данном случае.
Впрочем мне плевать. Горбатого могила исправит.

Спустя 15 минут, 42 секунды (12.11.2009 - 15:42) stepan написал(а):
Цитата (romul @ 12.11.2009 - 12:19)
А почему бессмысленно рядом с зашифрованным хранит?

Это тоже самое можно спросить а зачем вы брюки носите на себе?, носите их рядом, например в руках носите. cool.gif

Спустя 1 день, 1 час, 14 минут, 31 секунда (13.11.2009 - 16:56) romul написал(а):
Убедили... буду просто новый генерировать smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.