Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> odzyskiwanie hasła na e-mail a link
inomi13
post 24.07.2019, 13:12:42
Post #1





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


Stworzyłem formularz odzyskiwania hasła który wysyła na skrzynkę e-mailową nowe hasło a w bazie danych dodaje taki sam wpis w tabeli "pass_temp".
  1. $_SESSION['name'] = $wiersz['name'];
  2. $wynik= $polaczenie->query("SELECT pass from persons where email='$email'");
  3. $wiersz = $wynik->fetch_assoc();
  4. $wiersz['pass'] = str_shuffle("qwertyuiopasdfghjklzxcvbnm1234567890");
  5. $wiersz['pass'] = substr($wiersz['pass'],0,20);
  6. $haslo1=$wiersz['pass'];
  7. $haslo_hash = password_hash($haslo1, PASSWORD_DEFAULT);
  8. $zmiana = "UPDATE persons SET pass = '$haslo_hash', pass_temp = '$haslo_hash' WHERE email='$email'";


Osoba która otrzymuje e-maila klika w link "zmiana hasła" i może odrazu wpisać tymczasowe hasło, nowe i powtórzenie nowego hasła. Wszystko działa jednak jest problem w sytuacji jak dwie osoby w tym samym czasie chciały by odzyskać hasło. Proszę o jakieś sugestie

  1. require_once "connect.php";
  2. $polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
  3. $wynik= $polaczenie->query("SELECT user from persons where pass=pass_temp");
  4. $wiersz = $wynik->fetch_assoc();
  5. if(empty($wiersz["user"]))
  6. {
  7. header('Location: index.php');
  8. exit();
  9. }
  10. else
  11. {
  12. if(isset($_POST['ok']))
  13. {
  14.  
  15. $wszystko_OK=true;
  16. $user=$wiersz["user"];
  17. $haslo = $_POST['haslo'];
  18. $haslo1 = $_POST['haslo1'];
  19. $haslo2 = $_POST['haslo2'];
  20.  
  21.  


Go to the top of the page
+Quote Post
viking
post 24.07.2019, 13:21:26
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Twoje założenie jet w pewnym sensie słuszne bo zakłada że ostatnia próba jest tą poprawną. Ale jeśli chcesz wykonać jedną z wielu to możesz stworzyć nową tabelkę przechowującą te tymczasowe hasła + id usera i np po poprawnej weryfikacji skasować resztę.


--------------------
Go to the top of the page
+Quote Post
inomi13
post 24.07.2019, 13:28:44
Post #3





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


Kod tak działa że w momencie ustawienia nowego hasła w tabeli "pass_temp" zostanie wpisana pusta wartość
  1. <?php
  2. require_once "connect.php";
  3. $polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
  4. $wynik= $polaczenie->query("SELECT user from persons where pass=pass_temp");
  5. $wiersz = $wynik->fetch_assoc();
  6. if(empty($wiersz["user"]))
  7. {
  8. header('Location: index.php');
  9. exit();
  10. }
  11. else
  12. {
  13. if(isset($_POST['ok']))
  14. {
  15.  
  16. $wszystko_OK=true;
  17. $user=$wiersz["user"];
  18. $haslo = $_POST['haslo'];
  19. $haslo1 = $_POST['haslo1'];
  20. $haslo2 = $_POST['haslo2'];
  21.  
  22.  
  23.  
  24. if((strlen($haslo)<8) || (strlen($haslo1)<8)||(strlen($haslo)>20) || (strlen($haslo1)>20))
  25. {
  26. $wszystko_OK=false;
  27. $_SESSION['e_haslo']="Hasło musi posiadać od 8 do 20 znaków!";
  28.  
  29. }
  30. else
  31. {
  32. if($haslo1 != $haslo2)
  33. {
  34. $wszystko_OK=false;
  35. $_SESSION['e_haslo']="Nowe hasło i jego powtórzenie, nie są takie same!";
  36. }
  37. else
  38. {
  39.  
  40.  
  41. require_once "connect.php";
  42. mysqli_report(MYSQLI_REPORT_STRICT);
  43.  
  44.  
  45. {
  46. try
  47. {
  48. $polaczenie= mysqli_connect($host,$db_user,$db_password,$db_name);
  49. $wynik= $polaczenie->query("SELECT pass from persons where user='$user'");
  50. $wiersz = $wynik->fetch_assoc();
  51.  
  52. if ($polaczenie->connect_errno!=0)
  53. {
  54. throw new Exception(mysqli_connect_errno());
  55. }
  56. else
  57. {
  58.  
  59. if(password_verify($haslo, $wiersz['pass']))
  60. {
  61. $wszystko_OK=true;
  62.  
  63. $haslo_hash = password_hash($haslo1, PASSWORD_DEFAULT);
  64. $zmiana = "UPDATE persons SET pass = '$haslo_hash', pass_temp = '' WHERE user='$user'";
  65. if ($polaczenie->query($zmiana) === true)
  66. {
  67. $_SESSION['udanazmiana']=true;
  68. header('Location:pass_confirm_change.php');
  69. }}
  70. else
  71. {
  72. $wszystko_OK=false;
  73. $_SESSION['e_haslo']="Stare hasło jest nie poprawne";
  74. }
  75.  
  76. $polaczenie->close();
  77. }
  78. }
  79. catch(Exception $e)
  80. {
  81. echo '<span style="color:red;">Błąd serwera! Przepraszamy za niedogodności i prosimy o zmianę hasła w innym terminie!</span>';
  82. echo '<br />Informacja developerska: '.$e;
  83. }
  84. }}}}}
  85. ?>
Go to the top of the page
+Quote Post
dublinka
post 24.07.2019, 14:03:47
Post #4





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


skąd taka teza


--------------------
Go to the top of the page
+Quote Post
inomi13
post 24.07.2019, 14:07:44
Post #5





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


  1. $zmiana = "UPDATE persons SET pass = '$haslo_hash', pass_temp = '' WHERE user='$user'";

Tak jak mówię, problem jest w momencie jak dwie osoby wygenerowały by procedurę odzyskiwania hasła na e-maila bo wtedy kod zwróci dwie osoby
  1. SELECT user FROM persons WHERE pass=pass_temp

Nie mam pomysłu jak rozwiązać ten problem.
Go to the top of the page
+Quote Post
dublinka
post 24.07.2019, 14:14:40
Post #6





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


obawiam sie ze nie qmam.

"Tak jak mówię, problem jest w momencie jak dwie osoby wygenerowały by procedurę odzyskiwania hasła na e-maila bo wtedy kod zwróci dwie osoby"

Nie rozumiem tego. Moze wyjasnisz o co ci chodzi.

Nie ma znaczenia ile osob generuje taka procedure. Odwolujesz sie do konkretnego rekordu. Nie kumam dlaczego mialoby to kolidowac z innymi userami.

Po kiego grzyba user ma podawac tymczasowe haslo i nowe haslo ?

Wygeneruj na samym poczatku (rejestracja) jakies haslo -> zapisz do bazy. Czyli login, email, haslo costam co chcesz jeszcze. Oczywiscie powinienes podczas rejestracji zrobic opcje walidacji poprzez email i wtedy dwie tabele z czego jedna na tymczasowe dane i tutaj nalezy dodac pole na TIMESTAMP+czas na walidacje. W mo,mencie kiedy user w ciagu tego czasu kliknie pobieraz dane z linku (jakiestam co chcesz) i teraz laczysz sie z tabelą, pobierasz / sprawdzasz danei i dodajesz do konkretnej ., drugiej tabeli a z tej tymczasowej usuwasz wpis. Jesli uzytkownik nie kliknie w link w przeciagu tego czasu link wygasa -> dodac musisz mechanizm usuniecia automatycznego w momencie sprawdzenia i rowniez gdzies osadzic w innym pliku taki mechanizm. Podczas kazdorazowego wywolania przez userow skrypt bedzie sprawdzal czy czas w tabeli 'tmp' jest mniejszy od aktualnego i jesli tak usuwaj wszystko to co jest 'stare'
Teraz uzytkownik ma opcje zmiany hasla.
Po zalogowaniu uzyj sesji jako nazwe usera i pobierz dane z tabeli gdzie trzymasz dane: login, haslo, email.....
Wtedy WHERE user='$user' (zakladajac ze masz blokade powielania nazw takich samych loginow podczas rejestracji)
Wyswietlasz formularz z dwoma polami do wpisania nowego hasla (opcjonalnie pole na stare haslo)
i zapisujesz.
tyle.
Oczywiscie to w duzym skrucie bo trzeba zwalidowac wszystko po kolei.

Ten post edytował dublinka 24.07.2019, 16:35:08


--------------------
Go to the top of the page
+Quote Post
inomi13
post 24.07.2019, 20:33:05
Post #7





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


W przypadku zapomnienia hasła użytkownik wpisuje adres e-mail i dostaje nowe zahaszowane hasło na emaila. Chciał bym tak zrobić żeby użytkownik po otrzymaniu emaila z hasłem kliknął w link „zmiana hasła” i mógł od razu wpisać otrzymane hasło, nowe swoje hasło i powtórzenie swojego hasła. Teraz do działa ale najpierw użytkownik musi zalogować się otrzymanym tymczasowym hasłem aby mógł sobie zmienić hasło. Wymyśliłem ze w momencie generacji nowego hasła które jest wysyłane do użytkownika tworzy wpis w kolumnie pass oraz pass_temp i na tej podstawie sprawdzam jeżeli pass=pass_temp to wyświetl usera i ta procedura działa tylko problem pojawia się w momencie jeżeli kilka osób chciało by odzyskać hasło w tym samym momencie.
Go to the top of the page
+Quote Post
dublinka
post 25.07.2019, 07:34:09
Post #8





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


Dlaczego jest z tym problem? Podaj przyklad bo dalej nie kumam.


Mozna to prosciej zrobic.
Uzytkownik wpisuje adres email w pole txt. Klika dalej.
W momencie wygenerowania tymczasowego hasla slesz email do usera z danymi. Tyle. Nie trzeba tutaj mieszac jakis tymczasowych hasel itp.

W tym samym momencie zmieniasz haslo uzytkownika na haslo wlasnie wygenerowane.

To co opisujesz to opcja zmiany hasla ktoa powinna byc dostepna bedac zalogowanym
Wtedy slesz emaila z parametrami (jakis hasz ktory jest w bazie i email w adresie do weryfikacji) ustawiasz zywotnosc linku, dodajesz tymczasowe wpisy itp.

Ten post edytował dublinka 25.07.2019, 08:37:01


--------------------
Go to the top of the page
+Quote Post
gitbejbe
post 29.07.2019, 16:53:48
Post #9





Grupa: Zarejestrowani
Postów: 515
Pomógł: 63
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


strasznie to zagmatwane.

w ogóle po co jakieś tymczasowe hasło ? skoro - jak sam piszesz, użytkownik i tak je zmieni zaraz po zalogowaniu

User zapomniał hasła, klika w przycisk "resetuj hasło" i wpisuje adres email lub login dla którego ma zostać wysłany email z linkiem.

Link powinien zawierać token po którym strona zweryfikuje że ten użytkownik chce zmienić hasło, moze to wyglądać np:

www.jakastrona.pl/passreset?user=bolek&&token=idhasd12898sd9adjasd9022j1nndsa

to najprostsza wersja. Token generujesz haszując np email, login lub inne stałe dane użytkownika + sól. Klikając w link strona weryfikuje czy użytkownik istnieje, generuje token wg tego samego schematu co podczas tworzenia linka i porównujesz czy się zgadza. Jeśli jest ok, wyświetla formularz zmiany hasła gdzie podaje się już tylko nowe hasło i tyle.

można też zrobić oddzielną tablicę która zawiera tylko tokeny (przykładowa struktura: [id, userID, token, date]), łączysz ją relacją z tablicą users. Wtedy link mógłby już wyglądać tak:

www.jakastrona.pl/passreset?token=idhasd12898sd9adjasd9022j1nndsa

Plus jest taki że hash za każdym razem może być inny, bo masz go zapisanego w bazie. Po kliknięciu w link, sprawdzasz czy token istnieje w bazie i pobierasz dane użytkownika do którego został przypisany. Reszta bez zmian, jeśli jest ok, wyświetlasz formularz w którym user wpisuje nowe hasło. Jeśli chodzi o usuwanie wygasłych tokenów to w tym konkretnie przypadku możesz śmiało wykonywać to przed każdym sprawdzeniem tokena - cronjob nie ma sensu do takiego prostego zadania.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 21:01