Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowe generowania hasła (2 etapy) + MySQL
Forum PHP.pl > Forum > PHP
zaaap
Witam,
Chce na mojej stronie umiescic mozliwosc "Zapomnialem haslo". Po kliknieciu i podaniu nazwy uzytkownika na podany wczesniej adres email przychodzi losowo wygenerowane hasło, ktore nalezy uzyc do zalogowania sie. System uzywa bazy danych. Hasło generowane jest 2 etapach: 1) Wybranie losowe słowa ze słownika, 2) Generowanie ciagu liczb, które zostana "dolepione" do pobranego slowa.
Problem: System widzi słownik, pytanie czy jest on dobry, ale probowalem na dwoch roznych i jest to samo. System wysyla email, poprawnie informujac o nazwie uzytkownika lecz zmienna $haslo jest pusta. Takze wpis w bazie danych pozostaje niezmieniony. Nie wyskakuje zaden blad (jesli usune slownik calkowicie to blad sie ukazuje, wiec slownik 'widzi' jak mniemam).
Kody:

Pik wywołujacy:
  1. <?php
  2. $nazwa_uz = $_POST['nazwa_uz'];
  3.  
  4.  try
  5.  {
  6.     $haslo=ustaw_haslo($nazwa_uz);
  7.     powiadom_haslo($nazwa_uz, $haslo);
  8.     echo 'Nowe hasło zostało przesłane na adres poczty elektronicznej.<br />';
  9.  }
  10.  catch (Exception $e)
  11.  {
  12.     echo 'Hasło nie mogło zostać ustawione. Proszę spróbować póŸniej.';
  13.  }
  14.  tworz_HTML_URL('logowanie.php', 'Logowanie');
  15. ?>


Plik operujący:
  1. <?php
  2. function pobierz_losowe_slowo($dlugosc_min, $dlugosc_max)
  3.  
  4. {
  5.  
  6.  $slowo = '';
  7.  
  8.  $slownik = 'english.txt';  // słownik ispell
  9.  $wp = @fopen($slownik, 'r');
  10.  if(!$wp)
  11.    return false;
  12.  $wielkosc = filesize($slownik);
  13.  
  14.  
  15.  srand ((double) microtime() * 1000000);
  16.  $losowa_pozycja = rand(0, $wielkosc);
  17.  fseek($wp, $losowa_pozycja);
  18.  
  19.  
  20.  while (strlen($slowo)< $dlugosc_min || strlen($slowo)>$dlugosc_max || strstr($slowo, "'"))
  21.  {  
  22.     if (feof($wp))  
  23.        fseek($wp, 0);        
  24.     $slowo = fgets($wp, 80);  
  25.     $slowo = fgets($wp, 80);
  26.  };
  27.  $slowo=trim($slowo);
  28.  return $slowo;  
  29. }
  30.  
  31. function ustaw_haslo($nazwa_uz)
  32.  
  33. {
  34.  
  35.  $nowe_haslo = pobierz_losowe_slowo(6, 13);
  36.  
  37.  if($nowe_haslo==false)
  38.    throw new Exception('Wygenerowanie nowego hasła nie powiodło się.');
  39.  
  40.  srand ((double) microtime() * 1000000);
  41.  $losowa_liczba = rand(0, 999);
  42.  $nowe_haslo .= $losowa_liczba;
  43.  
  44.  
  45.  $lacz = lacz_bd_r();
  46.      return false;
  47.  $wynik = $lacz->query("update autorzy
  48.                         set haslo = sha1('$nowe_haslo')
  49.                         where nazwa_uz = '$nazwa_uz'");
  50.  if (!$wynik)
  51.    throw new Exception('Zmiana hasła nie powiodła się.');  
  52.  else
  53.    return $nowe_haslo;  
  54. }
  55.  
  56. function powiadom_haslo($nazwa_uz, $haslo)
  57.  
  58. {
  59.    $lacz = lacz_bd_r();
  60.    $wynik = $lacz->query("select email from autorzy
  61.                           where nazwa_uz='$nazwa_uz'");
  62.    if (!$wynik)
  63.    {
  64.      throw new Exception('Nie znaleziono adresu e-mail');
  65.    }
  66.    else if ($wynik->num_rows==0)
  67.    {
  68.      throw new Exception('Nie znaleziono adresu e-mail');
  69.    }
  70.    else
  71.    {
  72.      $wiersz = $wynik->fetch_object();
  73.      $email = $wiersz->email;
  74.      $od = "From: admin@admin.pl r\n";
  75.      $wiad = "Hasło do systemu z portfolio dla uzytkownika $nazwa_uz zostało zmienione na $haslo r\n"
  76.              ."Proszę zmienić je przy następnym logowaniu. r\n";
  77.      
  78.      
  79.      if (mail($email, 'Informacja o logowaniu', $wiad, $od))
  80.        return true;      
  81.      else
  82.        throw new Exception('Wysłanie e-maila nie powiodło się');
  83.    }
  84. }
  85. ?>
ultra_18
Cytat(zaaap @ 18.11.2008, 13:33:25 ) *
Witam,
Chce na mojej stronie umiescic mozliwosc "Zapomnialem haslo". Po kliknieciu i podaniu nazwy uzytkownika na podany wczesniej adres email przychodzi losowo wygenerowane hasło, ktore nalezy uzyc do zalogowania sie. System uzywa bazy danych. Hasło generowane jest 2 etapach: 1) Wybranie losowe słowa ze słownika, 2) Generowanie ciagu liczb, które zostana "dolepione" do pobranego slowa.
Problem: System widzi słownik, pytanie czy jest on dobry, ale probowalem na dwoch roznych i jest to samo. System wysyla email, poprawnie informujac o nazwie uzytkownika lecz zmienna $haslo jest pusta. Takze wpis w bazie danych pozostaje niezmieniony. Nie wyskakuje zaden blad (jesli usune slownik calkowicie to blad sie ukazuje, wiec slownik 'widzi' jak mniemam).
Kody:


widze że kolega przeczytał książke helionu za jedyne 99zl ;]

Sposób generowania hasła opisany w tej książce jest niepraktyczny, zajmuje duzo czasu i miejsca i wogóle daj sobie spokój z tamtym sposobem tu masz praktyczna funkcje:
  1. <?php
  2. function createkey($dlugosc) {
  3.    $key='';
  4.    for($i=0; $i<$dlugosc; $i++) {
  5.        switch(rand(1,3)) {
  6.            case 1: $key.=chr(rand(48,57));break;
  7.            case 2: $key.=chr(rand(65,90));break;
  8.            case 3: $key.=chr(rand(97,122));break;
  9.        }
  10.    } return $key;
  11.    }
  12. ?>
zaaap
Hehe rozgryzłes mnie! Hmm ok popatrze pozniej, teraz troche zajety jestem. Napisze czy dziala smile.gif

No wiec, haslo generuje i wysyla ok, ale nie chce updejtowac w bazie:
  1. <?php
  2. function ustaw_haslo($nazwa_uz)
  3. {
  4.  
  5.  $nowe_haslo = createkey(13);
  6.  
  7.  if($nowe_haslo==false)
  8.    throw new Exception('Wygenerowanie nowego hasła nie powiodło się.');
  9.  
  10.  
  11.  
  12.  $lacz = lacz_bd_r();
  13.      return false;
  14.  $wynik = $lacz->query("update autorzy
  15.                         set haslo = sha1('$nowe_haslo')
  16.                         where nazwa_uz = '$nazwa_uz'");
  17.  if (!$wynik)
  18.    throw new Exception('Zmiana hasła nie powiodła się.');  
  19.  else
  20.    return $nowe_haslo;  
  21. }
  22. ?>
ultra_18
Cytat(zaaap @ 18.11.2008, 17:02:44 ) *
Hehe rozgryzłes mnie! Hmm ok popatrze pozniej, teraz troche zajety jestem. Napisze czy dziala smile.gif

No wiec, haslo generuje i wysyla ok, ale nie chce updejtowac w bazie:
  1. <?php
  2. function ustaw_haslo($nazwa_uz)
  3. {
  4.  
  5.  $nowe_haslo = createkey(13);
  6.  
  7.  if($nowe_haslo==false)
  8.    throw new Exception('Wygenerowanie nowego hasła nie powiodło się.');
  9.  
  10.  
  11.  
  12.  $lacz = lacz_bd_r();
  13.      return false;
  14.  $wynik = $lacz->query(&#092;"update autorzy
  15.                         set haslo = sha1('$nowe_haslo')
  16.                         where nazwa_uz = '$nazwa_uz'&#092;");
  17.  if (!$wynik)
  18.    throw new Exception('Zmiana hasła nie powiodła się.');  
  19.  else
  20.    return $nowe_haslo;  
  21. }
  22. ?>



Mój sposób sprawdzania błedów w skryptach z zapytaniami do bazy wyglada tak że odpalam najpierw phpmyadmin i sprawdzam pierw wszystkie zapytania a później skrypt tobie też radze tak zrobić jak dla mnie błąd jest tu : haslo = sha1('$nowe_haslo') sprawdź
  1. <?php
  2. haslo = 'sha1($nowe_haslo)'
  3. ?>
, a najlepiej to nie wykonywać funkcji w zapytaniach
pyro
Cytat(ultra_18 @ 18.11.2008, 19:51:53 ) *
Mój sposób sprawdzania błedów w skryptach z zapytaniami do bazy wyglada tak że odpalam najpierw phpmyadmin i sprawdzam pierw wszystkie zapytania a później skrypt tobie też radze tak zrobić jak dla mnie błąd jest tu : haslo = sha1('$nowe_haslo') sprawdź
  1. <?php
  2. haslo = 'sha1($nowe_haslo)'
  3. ?>
, a najlepiej to nie wykonywać funkcji w zapytaniach


To co ty zrobiłes jest totalnie bez sensu, zainteresuj się podstawami stringów.
zaaap
Zastanawia mnie fakt, ze nie wyskakuje zaden blad a zmienna wynik jest niepusta, czyli akcja UPDATE powinna zakonczyc sie sukcesem. Niestety haslo nie zostaje zmienione

Hmm troche zmodyfikowalem kod:

1 pierwszym pliku dalem:
  1. <?php
  2. $nazwa_uz = $_POST['nazwa_uz'];
  3.  
  4.  try
  5.  {
  6.     $haslo=createkey(13);
  7.     nadpisz($nazwa_uz, $haslo);
  8.     powiadom_haslo($nazwa_uz, $haslo);
  9.     echo 'Nowe hasło zostało przesłane na adres poczty elektronicznej '.$haslo;
  10.  }
  11.  catch (Exception $e)
  12.  {
  13.     echo 'Hasło nie mogło zostać ustawione. Proszę spróbować póŸniej.';
  14.  }
  15. ?>


A w drugim taka fukcje:

  1. <?php
  2. function nadpisz($nazwa_uz, $haslo)
  3.  
  4. {
  5.  
  6.    $new_pass = $haslo;
  7.    
  8.  if($new_pass==false)
  9.    throw new Exception('Wygenerowanie nowego hasła nie powiodło się.');
  10.    
  11.  $lacz = lacz_bd_r();
  12.      return false;
  13.  $wynik = $lacz->query("update autorzy
  14.                         set haslo = '$new_pass'
  15.                         where nazwa_uz = '$nazwa_uz'");
  16.  if (!$wynik)
  17.    throw new Exception('Zmiana hasła nie powiodła się.');  // hasło nie zmienione
  18.  else
  19.    return $new_pass;  // hasło zmienione pomyœlnie  
  20. }
  21. ?>


Narazie wywalilem kodowanie, zeby bylo czytelniej.
I terazm nawet jesli dam "update autorzy123.." <-taka tabela nie istnieje, to nie wyrzuca zadnego bledu tylko idzie dalej i przysyla maila, ze wszytko w porzadku. Ktos wie jak to ugryzc?

Po recznym debugowaniu okazało sie, ze problemem była linia nr 14. w drugim pliku. Po skomentowania dziala OK
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.