Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Восстановить пароль
 
 автор: antei   (09.10.2010 в 03:40)   письмо автору
 
 

Перелистал кучу страниц, а нужен скрипт по восстановлению пароля посетителем
на сайте. С регистрацией и входом разобрался, с восстановлением завис.
На странице входа - ссылка на страницу восстановления пароля по логину и
e-mail, внесенными при регистрации. Застрял на запросах к базе.
Таблица users(user_name, user_pass, user_email ,user_date, user_level).
Нужно чтобы при вводе логина и e-mail, пароль автоматически отсылался
на мыло посетителя. Помогите со скриптом, пожалйуста.

  Ответить  
 
 автор: Gubichev   (09.10.2010 в 04:23)   письмо автору
 
   для: antei   (09.10.2010 в 03:40)
 

$login='';
$mail='';
$password=mysql_result(mysql_query("SELECT user_pass FROM users WHERE user_name='$login' && user_email='$mail'"),0);
if($password) mail("$mail","Восстановление пароля","Ваш пароль: $password");

  Ответить  
 
 автор: neadekvat   (09.10.2010 в 08:12)   письмо автору
 
   для: Gubichev   (09.10.2010 в 04:23)
 

Не надо хранить пароли пользователей в открытом виде.
Хэшируйте их.
А при восстановлении пароля будет два варианат:
1. Гененировать случайный пароль.
2. Генерировать некую ссылку, и отправлять ее на мыло - пройдя по этой ссылке, пользователь может сам ввести новый пароль.

  Ответить  
 
 автор: psychomc   (09.10.2010 в 09:16)   письмо автору
 
   для: neadekvat   (09.10.2010 в 08:12)
 

какой вопрос такой ответ :)

  Ответить  
 
 автор: neadekvat   (09.10.2010 в 11:19)   письмо автору
 
   для: psychomc   (09.10.2010 в 09:16)
 

Думать должен не только задающий вопрос, но и отвечающий ему.
Тут ведь не справочное бюро, чтобы отвечать только на поставленный вопрос - здесь форум :)

  Ответить  
 
 автор: psychomc   (09.10.2010 в 12:16)   письмо автору
 
   для: neadekvat   (09.10.2010 в 11:19)
 

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

  Ответить  
 
 автор: neadekvat   (09.10.2010 в 12:31)   письмо автору
 
   для: psychomc   (09.10.2010 в 12:16)
 

И то правда, третьим пунктом надо было сказать про шифрование.

  Ответить  
 
 автор: Gubichev   (09.10.2010 в 14:49)   письмо автору
 
   для: neadekvat   (09.10.2010 в 08:12)
 

Я привёл пример на основе таблицы автора. Я их не храню в открытом виде..

  Ответить  
 
 автор: neadekvat   (09.10.2010 в 14:59)   письмо автору
 
   для: Gubichev   (09.10.2010 в 14:49)
 

Думать должен не только задающий вопрос, но и отвечающий ему.
Тут ведь не справочное бюро, чтобы отвечать только на поставленный вопрос - здесь форум :)
Еще раз написать?

  Ответить  
 
 автор: Gubichev   (09.10.2010 в 15:19)   письмо автору
 
   для: neadekvat   (09.10.2010 в 14:59)
 

Вам надо - пожалуйста, объясняйте автору что и как, а я не посчитал нужным сообщать ему об этом.

  Ответить  
 
 автор: antei   (09.10.2010 в 15:58)   письмо автору
 
   для: neadekvat   (09.10.2010 в 08:12)
 

Спасибо за ответы, извините, что не сразу - жизнь студента - гонка!
Я вероятно поставил вопрос очень не корректно. Исправляюсь.
При построении сайта, вводятся функции регистрации, авторизации и
нужно ввести функцию или восстановления пароля, или генерации
нового, было-бы супер через мыло переходить на нужную страницу для смены пароля,
но в процессе обучения еще не достаточно знаний, и синтаксис приводит к ошибкам.
Одна из основных книг, которую изучаю -PHP 5/6 Кузнецова и Симдянова, 2010 года, где
и есть ссылка и отличные рекомендации по данному форуму. А теперь по сути:
При регистрации пароль кодируется так- с помощью функции sha1, может md5 лучше-
не знаю.

$sql = "INSERT INTO
users(user_name, user_pass, user_email ,user_date, user_level)
VALUES('" . mysql_real_escape_string($_POST['user_name']) . "',
'" . sha1($_POST['user_pass']) . "',
'" . mysql_real_escape_string($_POST['user_email']) . "',
NOW(),
0)";
Шифрование, я так понимаю, необратимое, поэтому при при восстановлении логично наверное
генерировать новый пароль как-то так -
$simvols = array ("0","1","2","3","4","5","6","7","8","9",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
но нужно записать его обратно в базу данных -

CREATE TABLE users(
user_id INT( 8 ) NOT NULL AUTO_INCREMENT ,
user_name VARCHAR( 30 ) NOT NULL ,
user_pass VARCHAR( 255 ) NOT NULL ,
user_email VARCHAR( 255 ) NOT NULL ,
user_date DATETIME NOT NULL ,
user_level INT( 8 ) NOT NULL ,
UNIQUE INDEX user_name_unique( user_name ) ,
PRIMARY KEY ( user_id )
) TYPE = INNODB

Запрос с файла vostparol.php вероятно может быть такой -
require 'connect.php';
include 'header.php';
echo '<div style="border:0; width:300px; height:250px; position:relative; left:270px; top:50px;">';
if($_SERVER['REQUEST_METHOD'] != 'POST')
{
echo '<form method="post" action="">
..............................................................
</form>';
//дальше обработчик ошибок -
}

else
{
$errors = array();

if(!isset($_POST['user_name']))
{
$errors[] = 'Ведите имя';
}
if(!isset($_POST['user_email']))
{
$errors[] = 'Введите email.';
}

if(!empty($errors))
{
echo 'Все поля должны быть заполнены..<br /><br />';
echo '<ul>';
foreach($errors as $key => $value)
{
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
// дальше нужны запросы правильные, на чем и застрял!!!
else
{
$sql = "SELECT user_id, user_name, user_level FROM users
WHERE user_name = '" . mysql_real_escape_string($_POST['user_name']) . "'
AND user_pass = '" . sha1($_POST['user_pass']) . "'";
$result = mysql_query($sql);
if(!$result)
{
echo 'Произошла ошибка - попробуйте позже.';
}
Дальше я пробовал по разному, но Денвер сильно ругается!!!
Если кто может помочь с данной проблемой, или найти лучшее решение,
будет прекрасно. Я думаю многие в свое время решали такую проблему,
и не все рождались программистами.

  Ответить  
 
 автор: neadekvat   (09.10.2010 в 16:13)   письмо автору
 
   для: antei   (09.10.2010 в 15:58)
 

Оформляйте код в [ code ] (без пробелов) не забывая ставить <?php в начале - так намного читабельние.

Если честно, не совсем понял, что у вас не получается.
Пользователь запрашивает восстановление пароля, вводит свой email или логин (как уж вы сделаете).
Допустим, что $user_id - переменная, содержащая id пользователя, которому надо восстановить пароль, а $user_email - его почта.
Генерируем пароль, н-р, так:
<?php
$chars 
"abcdefghijklmnopqrstuvwxyz";
$max 6;
$size strlen($chars)-1;
$new_pass null// пароль
while($max--)
    
$new_pass .= $chars[rand(0$size)];

// Обновляем профиль пользователя:
$sql "UPDATE users SET user_pass = SHA1('$new_pass') WHERE user_id = $user_id";
mysql_query($sql);

// отправляем письмо
$headers "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Admin<admin@site.ru>\r\n";

$subject 'Восстановление пароля';
$subject '=?utf-8?B?'.base64_encode($subject).'?=';

$mail "Новый пароль: $new_pass";

mail($user_email$subject$mail$headers);

Если у вас кодировка не utf-8, а, например, windows-1251, то надо заменить пару строк (думаю, догадаетесь):
<?php
$headers 
"Content-type: text/html; charset=windows-1251 \r\n";
$subject '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject"w","k")).'?=';


P.S. Писал пост в окошко ответа, так что это скорее скетч, использовать этот код нельзя.
P.P.S.
<?php
echo '<ul>';
foreach(
$errors as $key => $value
{
echo 
'<li>' $value '</li>'
}
echo 
'</ul>';

Бессмысленный лишний цикл,сделать можно, например, так:
<?php
echo '<ul><li>' implode('</li><li>'$errors) . '</li></ul>';

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования