Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]przypomnienie/zmiana zapomnianego hasła
Forum PHP.pl > Forum > Przedszkole
blackbone
witam, haha.gif
Czy ktokolwiek wie, jak wymusić zmianę, albo przypomnieć użytkownikowi hasło zapisane w bazie mysql(używając phpmyadmin). Do weryfikacji chcę użyć adresu majlowego, z wysłaniem przypomnianego hasła sobie poradzę, bynajmniej potrzebuję pomocy. rolleyes.gif
Crozin
Hasło w bazie przechowywane jest w formie jakiegoś hasha czy może jawnie?
blooregard
1. Opcja w panelu administracyjnym (np. "Przypomnij o zmianie hasła") - skrypt wybiera z bazy uzytkowników, których data zmiany hasła (odpowiednie pole w tabeli) jest starsza niz ustawiony w innej opcji interwał czasowy (np. 30 dni), następnie w pętelce wysyła odpowiedniego maila do usera. Po zaktualizowaniu przez niego hasła pole w kolumnie z datą jest odpowiednio modyfikowane

2. To samo, ale wrzucone do cron-a, z częstotliwością uruchamiania np. co godzinę smile.gif

Zakładam, że to hasło user może sobie zmienic sam, np. w jakimś tam swoim profilu
blackbone
hasło nie jest hashowane, a mi chodzi o przypomnienie zapomnianego hasła, słyszałem, że lepiej wymusić zmianę, dlatego też zawarłem to w temacie.
Oto mój kod:
CODE

<?
mysql_connect ("localhost", "root", "*******")
or die ("Nie można połączyć z bazą danych!");
mysql_select_db ("notatnik_users")
or die ("Nie można czytać tabeli");
$user_dane = mysql_query("SELECT * FROM user_primary WHERE usr_name='$usr' and usr_email='$email' and usr_pswrd='$pswrd'")
or die ("BŁĄD!Nie ma danych w tabeli lub błąd w pytaniu!");
while ($rekord=mysql_fetch_assoc($user_dane)){
$usr = $rekord['usr_name'];
$email = $rekord['usr_email'];
$pswrd = $rekord['pswrd'];

}
if ($_POST['email'] && $_POST['usr'] && $_POST['pswrd']){
//wypisz lub wyślij hasło na mail`a
} else {
print '
<form method=post>
<TABLE align=center cellpadding=4 cellspacing=0>
<TR>
<TD><input type=hidden name=pswrd value='.$pswrd.'><input type=text name=usr value="Nazwa użytkownika"></TD>
<TD><input type=text name=email value="Twój email"></TD>
<td>&nbsp;</td>
<TD align=right><input type=submit value=Przypomnij></TD>
</TR>
</TABLE>';
}
?>

Podejrzewam, że coś jest źle w zapytaniu mySQL...
blooregard
1. Najpierw poprawka (zwróc uwagę na znaki ' i " )
Kod
$user_dane = mysql_query("SELECT * FROM user_primary WHERE usr_name='".$usr."' and usr_email='".$email."' and usr_pswrd='".$pswrd." ' ")


2. Nie widzę w zapytaniu żadnego kryterium, które wskazywałoby na fakt przeterminowania hasła. Wysyłasz zawsze tego maila z przypomnieniem hurtem, do wszystkich, nawet tych, co zmienili hasło 5 minut wcześniej ?
blackbone
Bo mi nie chodzi o zmianę dla bezpieczeństwa, tylko dlatego że ktoś zapomniał, np. podaję mój adres email, nazwę użytkownika, aplikacja porównuje dane w formularzu z tymi które są w bazie danych, jeśli się zgadza wysyła na podany email hasło zapisane w bazie.
Crozin
Jeżeli hasło przechowujesz w formie jawnej to możesz zrobić prawdziwe "przypominanie".

1) Formularz w którym podaje się adres email i ew. login
2) Pobierasz hasło z tabeli użytkowników gdzie email = email_z_formularza (jeżeli dodatkowo jest login to jeszcze dodajesz w warunku AND login = login_z_formularza)
3) Na podany adres email wysyłasz hasło (mail" title="Zobacz w manualu PHP" target="_manual)
4) Koniec

A jeżeli chciałbyś zrobić generowanie nowego hasła to sprawa jest nieco bardziej skomplikowana (ale nadal bardzo prosta)
1) Jak wcześniej
2) Jak wcześniej z tym, że pobierasz ID, login, adres-email
3) W tabeli z użytkownikami musisz mieć dodatkową kolumnę, nazwijmy ją verifCode (typu CHAR(32)). Domyślna wartość jaką będzie przyjmowała to NULL.
4) Teraz musisz wygenerować losowy ciąg, który zostanie wysłany na maila w celu weryfikacji
  1. <?php
  2. $verifCode = md5(uniqid(mt_rand(), true));
  3. ?>

5) Kod ten zapisujesz do kolumny verifCode w tabeli użytkowników gdzie id = id_wyciagniete_ze_wczesniejszego_zapytania
6) Do użytkownika wysyłasz maila, w którym znajduje się link w postaci: example.com/pass.php?userid=XX&verif=YYY Gdzie XX to ID użytkownika, a YYY to wygenerowany kod ($verifCode)
7) Tworzysz plik pass.php
8) W nim sprawdzasz czy dla użytkownika o ID = $_GET['userid'] kolumna verifCode = $_GET['verif'].
9) Jeśli nie, nie robisz nic
10) Jeśli tak to rozpoczynasz generowanie hasła
11) Musisz wygenerować nowe hasło. Możesz to zrobić np. przy pomocy
  1. <?php
  2. $chars = 'qwertyuiopasdfghjklzxcvbnm1234567890!@#$%^&*()_+';
  3. $newPass = mb_substr(str_shuffle(str_repeat($chars, 4)), 0, mt_rand(6, 9));
  4. ?>

12) Tak wygenerowane hasło zapisujesz w bazie danych i wyświetlasz je użytkownikowi
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.