Jump to content
Michael2318

[PHP/MySQL] Przypomnienie hasła by Michael2318

Recommended Posts

Michael2318

Przedstawię skrypt pod mój poradnik Logowania & rejestracji na sesjach, dzięki któremu użytkownik będzie mógł zresetować swoje hasło

A więc najpierw dodajemy do bazy dwa pola:

ALTER TABLE `users` ADD `user_new_password` varchar(32) NOT NULL DEFAULT '0'; 
ALTER TABLE `users` ADD `user_new_password_time` int(11) NOT NULL DEFAULT '0';

Następnie na samym początku pliku z logowaniem/rejestracją dodajemy kilka langów oraz zmienną, w której należy podać adres www swojej strony!

<?php 

$website_name = 'http://twojastrona.pl/forum/'; 
$session_logged_in = (isset($_SESSION['nazwa'])) ? TRUE : FALSE; 

/* Langi */ 
$lang['Main_Info_Forgot_Password'] = 'Jeśli z jakichś powodów nie możesz się zalogować, możesz użyć tego formularza do zresetowania Twojego hasła, które zostanie wysłane na Twój e-mail.'; 
$lang['Email_address'] = 'Adres E-Mail'; 
$lang['Remind'] = 'Przypomnij'; 
$lang['Remind_Password_Successful'] = 'Twoje nowe hasło zostało wysłane pod wskazany adres e-mail. Sprwadź swoją skrzynkę pocztową i zaloguj się tutaj, korzystając w podanego w mailu hasła.'; 
$lang['Bad_Email'] = 'Wpisany email jest niepoprawny!'; 
$lang['Error_Remind_Password'] = 'Link aktywacyjny został już wysłany na Twoją skrzynkę mailową! Możesz tylko raz na 24 godziny poprosić o zresetowanie swojego hasła!'; 
$lang['Bad_Link'] = 'Link jest niepoprawny!'; 
$lang['Email_Remind_Password_Sent'] = 'Link aktywacyjny do rozpoczęcia zresetowania hasła został wysłany pod wskazany adres e-mail. Sprwadź swoją skrzynkę pocztową i kliknij w link zawarty w wiadomości.'; 
$lang['Error_Sent_Emails'] = 'Niespodziewany błąd przy próbie rozpoczęcia procesu zresetowania hasła. Zgłoś ten problem administratorowi strony.'; 
$lang['Title_Email_Remind_Password'] = 'Przypomnienie hasła'; 
$lang['Email_Message_Remind_Password'] = '<html>Witaj!<br>Poprosiłeś o zresetowanie Twojego hasła. W celu dokończenia procesu zresetowania hasła wejdź na poniższy link:<br>%s<br><br>Pozdr.</html>'; 
$lang['New_Password_Message'] = '<html>Witaj!<br>Poprosiłeś o przypomnienie Twojego hasła. Twoje nowe hasło to: <b>%s</b>. Zaloguj się, klikając w <br><a href="'.$website_name.'/login.php">TEN</a> odnośnik, korzystając z podanego hasła.<br><br>Pozdr.</html>'; 

/* Langi */

Po tej czynności należy dodać kod funkcji, która generuje nam losowy ciąg znaków (hasło). Opisywałem tą czynność w TYM poradniku. Należy po prostu dodać kod tej funkcji i tyle

Następnie dodajemy formularz, dzięki któremu będzie można podać adres e-mail i znaleźć ofiarę, która zapomniała swojego hasła:

if ( !isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' && !isset($_POST['submit']) ) 
{ 
   $body = $lang['Main_Info_Forgot_Password'].'<br><form action="login.php?forgot=password" method="post">'.$lang['Email_address'].'<input type="post" name="forgot_email"><br><input type="submit" name="submit" value="'.$lang['Remind'].'"></form>'; 
   echo $body; 
   exit; 
}

Teraz sprawdzamy czy istnieje w ogóle użytkownik o podanym adresie e-mail. Jeśli nie to wypluwamy błąd:

else if ( !isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' && isset($_POST['submit']) ) 
{ 
   $email = trim(htmlspecialchars($_POST['forgot_email'])); 
   $sql = "SELECT * FROM `users` WHERE email = '".$email."'"; 
   $result = mysql_query($sql) 
       or die(mysql_error()); 
   $num = mysql_num_rows($result); 
   $row = mysql_fetch_assoc($result); 
   if ( $num == 0 ) 
   { 
       echo $lang['Bad_Email']; 
       exit; 
   }

Jeśli jednak istnieje to preparujemy losowe ID, updatujemy do bazy danych oraz wysyłamy linka w treści maila. W linku zawarte będzie właśnie to ID, które wygenerowaliśmy i zupdatowaliśmy do bazy:

   else 
   { 
       if ( $row['user_new_password_time'] != '0' && ($row['user_new_password_time'] + (24 * 3600)) > time() ) 
       { 
           echo $lang['Error_Remind_Password']; 
           exit; 
       } 
       $new_password = generate_password(); 
       $sql = "UPDATE `users` SET user_new_password = '".$new_password."', user_new_password_time = '".time()."' WHERE id = ".$row['id'].""; 
       $result = mysql_query($sql) 
           or die(mysql_error()); 
       $headers  = 'MIME-Version: 1.0' . "\r\n"; 
       $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
       $email_to = $row['email']; 
       $topic = $lang['Title_Email_Remind_Password']; 
       $tresc = sprintf($lang['Email_Message_Remind_Password'], '<a href="'.$website_name.'login.php?forgot=password&reset_id='.$new_password.'">Kliknij tutaj</a>');; 
       if ( mail($email_to, $topic, $tresc, $headers) ) 
       { 
           echo $lang['Email_Remind_Password_Sent']; 
           exit; 
       } 
       else 
       { 
           echo $lang['Error_Sent_Emails']; 
           exit; 
       } 
   } 
}

Później, jeśli user już kliknie w linka z maila, sprawdzamy czy ID zawarte w linku pasuje w ogóle do któregoś z userów. Jeśli nie, to wypluwamy błąd, iż link jest niepoprawny:

if ( isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' ) 
{ 
   $reset_id = mysql_espace_string($_GET['reset_id']); 
   $sql = "SELECT * FROM `users` WHERE user_new_password = '".$reset_id."'"; 
   $result = mysql_query($sql) 
       or die(mysql_error()); 
   $num = mysql_num_rows($result); 
   $row = mysql_fetch_assoc($result); 
   if ( $num == 0 ) 
   { 
       echo $lang['Bad_Link']; 
       exit; 
   }

W przeciwnym wypadku generujemy nowy losowy ciąg znaków, tym razem updatujemy już hasło o wskazany ciąg i wysyłamy go w mailu do użytkownika:

   else 
   { 
       $new_password = generate_password(); 
       $sql = "UPDATE `users` SET password = '".md5($new_password)."', user_new_password = 0 WHERE id = '".$row['id']."'"; 
       $result = mysql_query($sql) 
           or die(mysql_error()); 
       $headers  = 'MIME-Version: 1.0' . "\r\n"; 
       $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; 
       $email_to = $row['email']; 
       $topic = 'Przypomnienie hasła - finalizacja'; 
       $tresc = sprintf($lang['New_Password_Message'], $new_password); 
       if ( mail($email_to, $topic, $tresc, $headers) ) 
       { 
           echo $lang['Remind_Password_Successful']; 
       } 
       else 
       { 
           echo $lang['Error_Sent_Emails']; 
       } 
   } 
} 

?>

To wszystko ;)

Jakie są plusy tego skryptu?

Jeśli ktoś zna maila np. swojego kolegi i chce mu zrobić "psikusa", zmieniając mu cały czas hasło (bo cały czas prosi o zmianę go, używając skryptu) i zarazem ma na celu zapchanie komuś skrzynki pocztowej - nie uda się to! Skrypt zmienia hasło dopiero po potwierdzeniu (kliknięciu) linka, który jest w mailu. Dodatkowo, jeśli ktoś raz poprosi o zmianę hasła i nie kliknie w link zawarty w mailu - drugi raz nie będzie mógł zrobić tej samej czynności! Dopiero po upływie 24h jest możliwość wysłania kolejnego maila z prośbą o zresetowanie hasła. Ładne jest tutaj zabezpieczenie przed spamem, jeśli ktoś nagminnie wysyłałby komuś prośby o zmianę hasła ;) 

Autor skryptu: Michael2318

  • Like 2

Share this post


Link to post
Share on other sites
bootek

Noo bardzo ładny skrypcik. Brawo Michael

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
×
×
  • Create New...