Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przypomnienie hasła
Forum PHP.pl > Forum > Przedszkole
inny02
Witam,

chcę dodać do tego istniejącego kodu, przypomnienie hasła, gdy hasło będzie kodowane w bazie.
Skrypt wysyła na email zapomniane hasło z bazy w formie jawnej, a jak tutaj dodać, jeśli użytkownik wyśle formularz przypomnienia hasła to:
generuje losowe hasło, następnie hasło haszuje w md5 i zapisuje w bazie.
Hasło to losowe(ale hasło przed z haszowaniem) wysyła na email, użytkownik może już się zalogować przez nowe hasło.

  1. if (isset($_POST["forgot"])) {
  2. $username = htmlspecialchars(trim($_POST["username"]));
  3. $email = htmlspecialchars(trim($_POST["email"]));
  4.  
  5. if (($username != "") || ($email != ""))
  6. {
  7. if ($username != "")
  8. $q = "SELECT * FROM `members` WHERE username = '$username'";
  9. else
  10. $q = "SELECT * FROM `members` WHERE email = '$email'";
  11.  
  12.  
  13. if(!($result_set = mysql_query($q))) die(mysql_error());
  14. $number = mysql_num_rows($result_set);
  15.  
  16. if (!$number) {
  17. echo "Sorry ! No account with the specified username or email exists";
  18. showForm();
  19. }
  20. else {
  21. $r = mysql_fetch_array($result_set);
  22. $email1 = $r['email'];
  23. $username = $r['username'];
  24. $password = $r['password'];
  25.  
  26.  
  27. $to = $email1;
  28. $subject = "$webtitle - Password Recovery";
  29. $body = "Hello $username, \n\nYou requested for your $webtitle account password recovery.\nYour registration information is shown below:\n\nUser: $username\nPass: $password\n\nThanks!\n{$website}";
  30. $headers = "From: $webtitle <{$website}>";
  31.  
  32.  
  33. if (mail ($to, $subject, $body, $headers))
  34. echo "An email has been sent with your password to the email address you specified during registration.";
  35. else
  36. { echo "Sorry ! The password recovery email could not be sent due to some reason."; showForm(); }
  37.  
  38. }
  39. }
  40. else
  41. { echo "Please give a username or email atleast !"; showForm(); }
  42. }
  43. else
  44. {
  45. if ($session == false)
  46. showForm();
  47. else
  48. echo "Sorry ! You are already logged in.";
  49. }


wiem, że trzeba użyć funkcji do generowania jakieś ciągu, UPDATE do bazy itd. tylko nie potrafię tego dołączyć do istniejącego kodu php.

Z góry dzięki za pomoc

Pozdrawiam
vokiel
Cytat(inny02 @ 19.09.2009, 14:57:38 ) *
Skrypt wysyła na email zapomniane hasło z bazy w formie jawnej, a jak tutaj dodać, jeśli użytkownik wyśle formularz przypomnienia hasła to:
generuje losowe hasło, następnie hasło haszuje w md5 i zapisuje w bazie.
Hasło to losowe(ale hasło przed z haszowaniem) wysyła na email, użytkownik może już się zalogować przez nowe hasło.


Taki sposób tworzenia nowego hasła jest moim zdaniem niewłaściwy. Czemu Ty na serwerze masz tworzyć nowe hasło a nie użytkownik sam sobie? Lepiej wysłać użytkownikowi link do resetowania hasła, on podaje nowe i te nowe jest hashowane i zapisywane do bazy. Wysyłanie hasła otwartym tekstem przez maila nie jest do końca bezpieczne.
inny02
wiem winksmiley.jpg ale strona to z niczym poważnym tylko hosting obrazków to wystarczy takie rozwiązanie
Mlodycompany
Vokiel ale link to strony resetującej hasło jest zbyt niebezpiecznym rozwiązaniem. Ktoś niewsłaściwy dostanie taki link i wzasadzie będzie mógł zmienić hasło każdej osobie
vokiel
@Mlodycompany - zauważ, że bardzo dużo, poważnych serwisów tak robi. Nie dajesz przecież linka w postaci resetuj_hasło.php?mail=twoj@mail.pl, tylko dajesz link, w którym masz hash. Hash powstaje ze złączenia kilku informacji: salt, mail, data rejestracji. Zapisywany jest w bazie wraz z datą utworzenia. Następnie ktoś wchodzi na link i podaje adres mailowy. Szuka się w bazie konta, z tym adresem email, dla którego został utworzony hash, sprawdza się go z tym z adresu, oraz sprawdza datę ważności (hash do resetowania musi mieć jakiś okres ważności - np tydzień). Dopiero spełnienie tych wszystkich warunków daje jakieś poczucie bezpieczeństwa. Sam hash'a nie wymyślisz, bo nawet jeśli znasz datę rejestracji to nie znasz dokładnej godziny, minuty i sekundy no i oczywiście pozostaje jeszcze salt...

@inny02
Schemat postępowania:
1. Kliknięcie w przycisk "nie pamiętam hasła"
2. Wyświetlenie formularza z polem na adres email podany podczas rejestracji. (widzę, że masz oddzielnie username a oddzielnie email - w znaczeniu, że email nie jest loginem - zatem jeszcze dodajesz pole username)
3. Po wysłaniu formularza sprawdzasz w php czy dla danego username jest podany taki email jak przesłany w formularzu, jeśli nie to wyświetlasz komunikat, że dane niepoprawne. Jeśli jest ok, patrz pkt 4
4. Tworzysz sobie hash (jak napisałem wyżej: username+salt+email+cokolwiek tam jeszcze chcesz), zapisujesz go do kolumny np hash, a obok, do kolejnej datę utworzenia.
5. Tworzysz wiadomość email dla użytkownika a w nim link do resetowania hasła: restetpass.php?key=$hash
6. Po wejściu na stronę z danego linku wyświetlasz formularz z polami username + email +nowe_haslo +nowe_haslo_sprawdzenie
7. Odbierasz wyniki z formularza i sprawdzasz ich poprawność:
a). czy email + username się zgadza
cool.gif. czy dla danego hashu jest w bazie konto z podanym email + username
c). czy hash jest aktualny
d). czy hasło i jego powtórzenie są identyczne
8. Jeśli wszystko jest ok, zapisujesz (zhashowane) hasło do bazy, usuwasz hash i datę jego wstawienia, ew wysyłasz maila potwierdzającego zmianę hasła, no i oczywiście komunikat, że hasło zostało zmienione, możesz też od razu użytkownika zalogować.

No to chyba z grubsza tyle winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.