W każdej witrynie, w której można się zarejestrować czasami zdarza się tak, że ktoś zapomni swojego hasła do konta.
W takiej sytuacji przydał by się skrypt / narzędzie do przypomnienia hasła. Jak go wykonać? Jest wiele dróg i sposobów na rozwiązanie tego problemu. Poniżej przedstawię kilka z nich.
Załóżmy ze mamy w bazie danych tabele z użytkownikami:
[code]Tabela:USERS
z polami: ID, login, password, email, code[/code]
Oraz do wszystkich rozpatrywanych przypadków korzystamy z pliku: function.php, którego zawartość jest następująca:
<?php //tworzymy klasę class funkcje{ // połączenie z bazą danych function connect_bd(){ $result= new mysqli('adres_bazy', 'user', 'haslo', 'nazwa_bazy'); if (mysqli_connect_errno() === 0){ $result -> query("SET NAMES 'utf8'"); if (!$result) return false; else { return $result; } } } //funkcja zapisująca pojedynczy wynik z bazy do tablicy public function get_single_shot($quest){ $connect=$this->connect_bd(); $result=$connect->query($quest); if (!$result){echo "blad w get single shot <br> w zapytaniu: ".$quest."<br>"; return false;} if ($result->num_rows>0) { $result_array=@$result->fetch_assoc(); return $result_array; } else { return 0; } } //zamyka klase } ?>
Przypadek 1: przypomnienie hasła, które jest w formie niezakodowanej.
W tym przypadku aby zachować minimum wymaganej ostrożności, prosimy użytkownika o podanie adresu e-mail do swojego konta. Po podaniu prawidłowego adresu, na e-mail użytkownika wysyłane jest hasło do konta.
Tworzymy plik resetpass.php i wpisujemy:
<?php include_once 'function.php'; if (isset($_POST["wyslane"])) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt // filtrowanie treści wprowadzonych przez użytkownika $email = htmlspecialchars(stripslashes(strip_tags(trim($_POST["email"]))), ENT_QUOTES); //korzystamy z naszej klasy $get=new funkcje(); $connect=$get->connect_bd(); // system sprawdza czy prawidło zostały wprowadzone dane if (!eregi("^[0-9a-z_.-]+@([0-9a-z-]+\.)+[a-z]{2,4}$", $email)) { $blad=1; echo '<p class="blad"> Proszę wprowadzić poprawnie adres email.</p>'; } else { //sprawdzanie czy istnieje w bazie podany email $sql1="SELECT login FROM USERS WHERE email='$email'"; $result1=$get->get_single_shot($sql1); if (isset($result1['login'])) { $blad=0; //jeli istnieje login blad=0 }else { //jesli nie istnieje konto blad=1 echo '<p class="blad">Konto o podanym adresie e-mail nie istnieje!</p>'; $blad=1; } } // jesli email istnieje i nie ma żadnego błedu, wysylany zostaje email z haslem if ($blad == 0) { $sql2="select password, login from USERS where email='$email'"; $result=$get->get_single_shot($sql2); if ($result) { // zapisywanie w zmiennej $list zawartosci tresci email $list = "Witaj! <br> Hasło dla konta: ".$result['login']." <br> to: ".$result['password']; $headers="From: <admin@nazwa_strony.pl>".PHP_EOL; $headers.= 'MIME-Version: 1.0' .PHP_EOL; $headers.="Content-type: text/html; charset=utf-8".PHP_EOL; $headers.="X-Mailer: PHP/". phpversion(); //proba wyslania emaila z danymi if(mail($email, "hasło do konta", $list,$headers)){ echo '<p>Hasło zostało wysłane e-mailem</p>'; //ustawiamy zmienna $ok na wartość 1 $ok=1; } else { echo"Błąd!! - skontaktuj sie z adminitratorami serwisu."; }}}} // tworzenie formularza HTML w przypadku gdy zmienna $ok nie została ustawiona na wartosc 1 if($ok!=1){ ?> <form action="../users/resetpaswd.php" method="post"> <input type="hidden" name="wyslane" value="TRUE" /> <fieldset class='register'><legend>E-mail:</legend> <div class='k1'> Wpisz swój adres e-mail podany przy rejestraji: <input type="text" name="email"/> </div> </fieldset> <p class="submit"> <input type="submit" value="Przypomnij hasło" /> </p></form> <?php } ?>
Przypadek 2: przypomnienie hasła, które jest w formie zakodowanej.
W przypadku kodowania haseł – nie mamy możliwości przesłania użytkownikowi jego aktualnego hasła. Więc co możemy w tej sytuacji zrobić?
Podam dwa rozwiązania.
W obu korzystamy z pliku resetpass.php którego treść wygląda następująco:
<?php include_once 'function.php'; if (isset($_POST["wyslane"])) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt // filtrowanie treści wprowadzonych przez użytkownika $email = htmlspecialchars(stripslashes(strip_tags(trim($_POST["email"]))), ENT_QUOTES); //korzystamy z naszej klasy $get=new funkcje(); // system sprawdza czy prawidło zostały wprowadzone dane if (!eregi("^[0-9a-z_.-]+@([0-9a-z-]+\.)+[a-z]{2,4}$", $email)) { $blad=1; echo '<p class="blad"> Proszę wprowadzić poprawnie adres email.</p>'; } else { //sprawdzanie czy istnieje w bazie podany email $sql1="SELECT login FROM USERS WHERE email='$email'"; $result1=$get->get_single_shot($sql1); if (isset($result1['login'])) { $blad=0; //jeli istnieje login blad=0 }else { //jesli nie istnieje konto blad=1 echo '<p class="blad">Konto o podanym adresie e-mail nie istnieje!</p>'; $blad=1; } } // jesli email istnieje i nie ma żadnego błedu, wysylany zostaje email z powiadomieniem o zmianie hasla if ($blad == 0) { $sql2="select code, login from USERS where email='$email'"; $result=$get->get_single_shot($sql2); if ($result) { // zapisywanie w zmiennej $list zawartosci tresci email $list = "Witaj! <br> Ktoś poprosił o wygenerowanie nowego hasła dla konta: ".$result['login']." <br> Jeśli jest to błąd, po prostu zignoruj tego e-maila, a nic się nie stanie. <br><br> Aby ustawić nowe hasło, przejdź pod poniższy adres: <br><br> <a href='http://www.nazwa_strony.pl/veryfication.php?resetpaswd=yes&user=".$result['login']."&code=".$result['code']."' target='_blank'>www.nazwa_strony.pl/veryfication.php?resetpaswd=yes&user=".$result['login']."&code=".$result['code']."</a>"; $headers="From: <admin@nazwa_strony.pl>".PHP_EOL; $headers.= 'MIME-Version: 1.0' .PHP_EOL; $headers.="Content-type: text/html; charset=utf-8".PHP_EOL; $headers.="X-Mailer: PHP/". phpversion(); if(mail($email, "Ustawianie nowego hasła", $list,$headers)){ echo '<p>Odnośnik potwierdzający został wysłany e-mailem</p>'; $ok=1; } else { echo"Błąd!! - skontaktuj się z administratorami serwisu."; }}}} // tworzenie formularza HTML if($ok!=1){ ?> <form action="../users/resetpaswd.php" method="post"> <input type="hidden" name="wyslane" value="TRUE" /> <fieldset class='register'><legend>E-mail:</legend> <div class='k1'> Wpisz swój adres e-mail podany przy rejestraji: <input type="text" name="email"/> </div> </fieldset> <p class="submit"> <input type="submit" value="Przypomnij hasło" /> </p></form> <?php } ?>
Rozwiązanie 1.
Prosimy użytkownika o podanie adresu e-mail konta. Jeśli podano prawidłowy e-mail, wysyłana zostaje wiadomość ze specjalnie spreparowanym linkiem do formularza w serwisie gdzie użytkownik będzie mógł sobie zmienić swoje hasło.
Tworzymy plik veryfication.php
<? include_once 'function.php'; //dolaczanie pliku z klasa funkcje if ($_REQUEST['resetpaswd'] == 'yes') { ?><h2 class="title"> Resetowanie hasła: </h2> <div class="entry"><?php if (isset($_POST["code"])) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt $login = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST["user"]))), ENT_QUOTES); $code = htmlspecialchars(stripslashes(strip_tags(trim($_POST["code"]))), ENT_QUOTES); // filtrowanie treści wprowadzonych przez użytkownika $haslo = $_POST["password"]; $haslo2 = $_POST["password2"]; $get=new funkcje(); $connect=$get->connect_bd(); // system sprawdza czy prawidło zostały wprowadzone dane $blad=0; if (strlen($haslo) < 6 or strlen($haslo) > 30 ) { $blad=1; echo '<p class="blad">Proszę poprawnie wpisać hasło (od 6 znaków do 30 znaków). </p>'; } if ($haslo !== $haslo2) { $blad=1; echo '<p class="blad"> Podane hasła nie są ze sobą zgodne. </p>'; } $quest="select login from USERS where login='$login' and code='$code'"; $result1=$get->get_single_shot($quest); if (isset($result1['login'])) { $blad=0; }else { $blad=1; echo '<p class="blad">Błędny kod zmiany hasła</p>'; } // jeżeli nie ma żadnego błedu, użytkownik zostaje zarejestronwany i wysłany do niego e-mail z linkiem aktywacyjnym if ($blad == 0) { $haslo = md5($haslo); // zaszyfrowanie hasla $quest="update USERS set password='$haslo' where login='$login'"; $result=$connect->query($quest); if ($result) { echo "Hasło zostało zmienione"; $ok=1; } else "wystąpił nieznany błąd - zmiany hasła"; } } if($ok!=1){ ?> <form action="http://www.kosmosnews.pl/users/veryfication.php?resetpaswd=yes&user=<?php echo $_REQUEST['user'];?>&code=" method="post"> <input type="hidden" name="code" value="<?php echo $_REQUEST['code'];?>" /> <fieldset class='register'><legend>Hasło:</legend> <div class='k1'> Wpisz swoje hasło*: <input type="password" name="password"/> </div> <div class='k1'> Potwierdź hasło*: <input type="password" name="password2"/> </div> </fieldset> <p class="submit"> <input type="submit" value="Zapisz nowe hasło" /> </p></form><?php }?> </div> <?php }else{ echo " nie przekazano paremetrow - brak dzialania"; } ?>
Rozwiązanie 2.
Prosimy użytkownika o podanie adresu e-mail konta. Jeśli podano prawidłowy e-mail, wysyłana zostaje wiadomość ze specjalnie spreparowanym linkiem do serwisu, gdzie po wejściu na wskazany link/adres strona wygeneruje automatycznie nowe hasło i prześle go do użytkownika.
Tworzymy plik veryfication.php
<?php include_once 'function.php'; //dolaczanie pliku z klasa funkcje if ($_REQUEST['resetpaswd'] == 'yes') { ?><h2 class="title"> Resetowanie hasła: </h2> <div class="entry"><?php if (isset($_REQUEST["code"])) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt // filtrowanie treści wprowadzonych przez użytkownika $login = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST["user"]))), ENT_QUOTES); $code = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST["code"]))), ENT_QUOTES); $get=new funkcje(); $connect=$get->connect_bd(); // system sprawdza czy prawidło zostały wprowadzone dane $blad=0; $quest="select login from USERS where login='$login' and code='$code'"; $result1=$get->get_single_shot($quest); if (isset($result1['login'])) { $blad=0; }else { $blad=1; echo '<p class="blad">Błędny kod zmiany hasła</p>'; } // jeżeli nie ma żadnego błedu, użytkownik zostaje zarejestronwany i wysłany do niego e-mail z linkiem aktywacyjnym if ($blad == 0) { $czyste_haslo=uniqid('kod'); // generowanie losowego hasla - z poczatkowa wartoscia kod $haslo = md5($czyste_haslo); // zaszyfrowanie hasla $quest="update USERS set password='$haslo' where login='$login'"; // zapytanie do bazy o aktualizacje zmiany hasła $result=$connect->query($quest); // wysłanie zapytania if ($result) {//jesli ok to wysylany zostaje email z nowych haslem $list = " Witaj! Oto twoje dane do konta <br> Nazwa użytkownika: ".$result['login']." <br> Nowe hasło: ".$czyste_haslo." <br> "; $headers="From: <admin@nazwa_strony.pl>".PHP_EOL; $headers.= 'MIME-Version: 1.0' .PHP_EOL; $headers.="Content-type: text/html; charset=utf-8".PHP_EOL; $headers.="X-Mailer: PHP/". phpversion(); if(mail($email, "Nowe hasło", $list,$headers)){ echo '<p>Nowe hasło zostało wysłane!</p>'; } else { echo"Błąd!! - skontaktuj sie z adminitratorami serwisu."; } } } } }else{ echo " nie przekazano paremetrow - brak dzialania"; } ?>
I to by było na tyle. W razie gdybyście zauważyli jakiś błąd to proszę o info. Pisałem z ręki nie sprawdzając czy wszystko działa wiec jakaś literówka mogła się zdarzyć.