Pomoc - Szukaj - U¿ytkownicy - Kalendarz
Pe³na wersja: [MySQL][PHP]Edycja rekordu
Forum PHP.pl > Forum > Przedszkole
Pcbecaw
Mam z internetu taki formularz dot. zmiany has³a w panelu u¿ytkownika:
  1. <form action="" method="post">
  2. Podaj login: <input type="text" name="nick" /><br /><br />
  3. Podaj email:<input type="text" name="email" /><br /><br />
  4. Podaj has³o:<input type="password" name="haslo" /><br /><br />
  5. <input name="dalej" type="submit" value="Dalej"><br /><br />
  6. </form>
  7.  
  8. <?php include("config.php");
  9. error_reporting(E_ALL^E_NOTICE);
  10. if($_POST['dalej'])
  11. {
  12. $haslo = substr(addslashes($_POST['haslo']),0,32);
  13.  
  14. if(empty($login) || empty($haslo) || empty($email)) $wiadomosc .= "Uzupe³nij wszystkie pola<br>";
  15.  
  16. if(empty($wiadomosc))
  17. {
  18.  
  19. // sprawdzanie loginu
  20.  
  21. $log = mysql_query("SELECT * FROM uzytkownicy WHERE nick='".$login."'");
  22. $log1 = mysql_num_rows($log);
  23.  
  24. if($log1 === 0) $wiadomosc .= "Podany login nie istieje<br>";
  25.  
  26. // sprawdzanie hasla
  27.  
  28. $has = mysql_query("SELECT * FROM uzytkownicy WHERE haslo='".$haslo."'");
  29. $has1 = mysql_num_rows($has);
  30.  
  31. if($has1 === 0) $wiadomosc .= "Podane has³o jest nieprawid³owe<br>";
  32.  
  33. // sprawdzanie emaila
  34.  
  35. $ema = mysql_query("SELECT * FROM uzytkownicy WHERE email='".$email."'");
  36. $ema1 = mysql_num_rows($ema);
  37.  
  38. if($ema1 === 0) $wiadomosc .= "Podany email nie istnieje<br>";
  39. }
  40. }
  41.  
  42.  
  43.  
  44. if($_POST['dalej'] and empty($wiadomosc))
  45. {
  46. echo '
  47. <form action="" method="post">
  48. <input type="hidden" name="login" value="'.$login.'">
  49. Podaj stare has³o <input type="password" name="haslos" /><br /><br />
  50. Podaj nowe has³o <input type="password" name="haslo1" /><br /><br />
  51. Powtórz nowe has³o <input type="password" name="haslo2" /><br /><br />
  52. <input name="zapisz" type="submit" value="Zapisz" /></form>
  53. ';
  54. }
  55.  
  56.  
  57.  
  58. if($_POST['zapisz'])
  59. {
  60. $haslos = substr(addslashes($_POST['haslos']),0,32);
  61. $haslo1 = substr(addslashes($_POST['haslo1']),0,32);
  62. $haslo2 = substr(addslashes($_POST['haslo2']),0,32);
  63.  
  64. if(empty($haslos) || empty($haslo1) || empty($haslo2)) $wiadomosc .= "Uzupe³nij wszystkie pola<br>";
  65.  
  66. if(empty($wiadomosc))
  67. {
  68. $has = mysql_query("SELECT * FROM uzytkownicy WHERE haslo='".$haslos."'");
  69. $has1 = mysql_num_rows($has);
  70.  
  71. if($has1 === 0) $wiadomosc .= "Stare has³o nie pasuje<br>";
  72. if($haslo1 != $haslo2) $wiadomosc .= "Has³a s± ró¿ne<br>";
  73. }
  74. if(empty($wiadomosc))
  75. {
  76.  
  77. $zapytanie1 = 'UPDATE `uzytkownicy` SET `haslo`= "'.$haslo2.'" WHERE `nick`="'.$login.'"';
  78. $idzapytania1 = mysql_query($zapytanie1) or die(mysql_error());
  79. $wiadomosc .= "has³o zosta³o zmienione<br>";
  80. }
  81. }
  82. echo $wiadomosc;
  83. ?>

W bazie has³a w rejestracji koduje tak:
  1. $haslo = substr(addslashes($_POST['haslo']),0,32);


Teraz problem pojawia siê w edycji i uwierzytelnianiu. Po wpisaniu has³a takiego, jak przy rejestracji, wyskakuje komunikat, ¿e has³a s± nieprawid³owe. Jednak po skopiowaniu zakodowanego has³a i wpisanie go w pole formularza - wszystko jest ok. B³êdem jest odkodowywanie has³a w pliku dot. edycji has³a. Jak to naprawiæ?
Dziêki, pozdrawiam wink.gif
mortus
Wyrzuæ to do kosza i napisz w³asny skrypt. Tego:
  1. $haslo = substr(addslashes($_POST['haslo']),0,32);

kodowaniem nazwaæ nie mo¿na. Powy¿szy fragment wycina 32 znaki z ci±gu podanego przez u¿ytkownika (niejawnie go oszukuj±c) i troszkê zmodyfikowanego. Skrypt w ogóle nie jest bezpieczny, a tu siê jeszcze has³o skraca. W dodatku autor nie u¿ywa ¿adnej funkcji hashuj±cej. Ciekawym "zabiegiem" pos³u¿y³ siê autor skryptu wy³±czaj±c raportowanie uwag (E_NOTICE), co da³o mu mo¿liwo¶æ nadu¿ywania funkcji empty(). Tymczasem empty() powinno mieæ nieco inne zastosowanie.

Poszukaj na forum, a z pewno¶ci± znajdziesz bardziej odpowiednie rozwi±zania, a na pewno konkretne podpowiedzi.
Turson
Wystarczy funkcja update bazy danych.
A has³o pierw zakoduj md5
Pcbecaw
Zabra³em z kodu tylko kawa³ek, lekko przerobi³em, dzia³a, wywala notice i wysz³o co¶ takiego:
  1. echo '
  2. <form action="" method="post">
  3. <input type="hidden" name="login" value="'.$login.'">
  4. Podaj stare has³o <input type="password" name="haslos" /><br /><br />
  5. Podaj nowe has³o <input type="password" name="haslo1" /><br /><br />
  6. Powtórz nowe has³o <input type="password" name="haslo2" /><br /><br />
  7. <input name="zapisz" type="submit" value="Zapisz" /></form>
  8. ';
  9.  
  10.  
  11.  
  12.  
  13. if($_POST['zapisz'])
  14. {
  15. $haslos = md5(addslashes($_POST['haslos']));
  16. $haslo1 = md5(addslashes($_POST['haslo1']));
  17. $haslo2 = md5(addslashes($_POST['haslo2']));
  18.  
  19. if(empty($haslos) || empty($haslo1) || empty($haslo2)) $wiadomosc .= "Uzupe³nij wszystkie pola<br>";
  20.  
  21. if(empty($wiadomosc))
  22. {
  23. $has = mysql_query("SELECT * FROM uzytkownicy WHERE haslo='".$haslos."'");
  24. $has1 = mysql_num_rows($has);
  25.  
  26. if($has1 === 0) $wiadomosc .= "Stare has³o nie pasuje<br>";
  27. if($haslo1 != $haslo2) $wiadomosc .= "Has³a s± ró¿ne<br>";
  28. }
  29. if(empty($wiadomosc))
  30. {
  31.  
  32. $zapytanie1 = 'UPDATE `uzytkownicy` SET `haslo`= "'.$haslo2.'" WHERE `nick`="'.$login.'"';
  33. $idzapytania1 = mysql_query($zapytanie1) or die(mysql_error());
  34. $wiadomosc .= "has³o zosta³o zmienione<br>";
  35. }
  36. }
  37. echo $wiadomosc;

Notice jest tutaj - if (empty($user[id]) OR !isset($user[id])) {
tutaj - echo 'Witaj '.$user[nick].' zosta³e/a pomylnie zalogowany/a, tutaj umieæ ukryta strone tylko dla zalogowanych';
tutaj - if($_POST['zapisz'])
i tutaj - echo $wiadomosc;
jak to, niezdefiniowane? Jakby to usprawniæ zwa¿aj±c na to, ¿e chcia³bym mieæ poprawny ten kod.
mortus
Po pierwsze zauwa¿, ¿e element tablicy $_POST['zapisz'] istnieje (jest ustawiony, ang. isset) tylko wtedy, gdy wy¶lesz dane poprzez formularz. Oznacza to, ¿e przy ka¿dym pierwszym wej¶ciu na stronê bêdzie pojawia³ siê komunikat uwagi NOTICE, poniewa¿ takiego elementu jeszcze w talicy $_POST nie ma. W tym przypadku trzeba zast±piæ liniê 13 takim kodem (który de facto niewiele siê ró¿ni):
  1. if(isset($_POST['zapisz'])) {

U¿ytkownika powiniene¶ identyfikowaæ po jego id, a nie po loginie. Skoro jest to formularz zmiany has³a i mo¿esz okre¶liæ login u¿ytkownika, to i mo¿esz okre¶liæ jego id. Zast±p zatem ukryte pole login ukrytym polem id, i przekazuj w nim identyfikator u¿ytkownika.
Trzecia sprawa to kwestia u¿ycia funkcji empty(). Po co kodowaæ pusty ³añcuch znaków (bo to siê w³a¶nie dzieje, gdy u¿ytkownik nie uzupe³ni którego¶ z pól)? Linie 16, 17 i 18 powinny siê znale¼æ dopiero w bloku if(empty($wiadomosc)) {. Natomiast instrukcja warunkowa w linii 20 powinna wygl±daæ tak:
  1. if(empty($_POST['haslos']) || empty($_POST['haslo1']) || empty($_POST['haslo2']))

Pozostaje jeszcze kwestia u¿ycia funkcji addslashes(). Modyfikuje ona has³o podane przez u¿ytkowniaka, a wcale nie jest tutaj potrzebna. Oznacza to tyle, ¿e has³o w bazie danych nie jest has³em u¿ytkownika. Jest wiele sposobów na zabezpieczenie has³a np. sól, podwójne hashowanie lub "miks" obu wspomnianych metod, itp.
Pcbecaw
Pozmienia³em, s± jeszcze notice, ale nie tutaj tkwi b³±d. Mianowicie: nie zmienia hase³ w bazie. Co mo¿e byæ tego powodem?
  1. <?php include("config.php");
  2.  
  3. $nick = $_SESSION['nick'];
  4. $haslo = $_SESSION['haslo'];
  5. if ((empty($nick)) AND (empty($haslo))) {
  6. echo '<br>Nie by³e zalogowany albo zosta³e wylogowany<br><a href="index.php">Strona G³ówna</a><br>';
  7. }
  8. $user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' AND `haslo`='$haslo' LIMIT 1"));
  9. if (empty($user[id]) OR !isset($user[id])) {
  10. echo '<br>Nieprawid³owe logowanie.<br>';
  11. }
  12. // tresc dla zalogowanego uzytkownika
  13. echo 'Witaj '.$user[nick].' zosta³e/a pomylnie zalogowany/a, tutaj umieæ ukryta strone tylko dla zalogowanych';
  14. echo '<br><a href="wyloguj.php">Wyloguj mnie</a>';
  15. echo '
  16. <form action="" method="post">
  17. <input type="hidden" name="login" value="'.$login.'">
  18. Podaj stare has³o <input type="password" name="haslos" /><br /><br />
  19. Podaj nowe has³o <input type="password" name="haslo1" /><br /><br />
  20. Powtórz nowe has³o <input type="password" name="haslo2" /><br /><br />
  21. <input name="zapisz" type="submit" value="Zapisz" /></form>
  22. ';
  23.  
  24.  
  25.  
  26.  
  27. if(isset($_POST['zapisz']))
  28. {
  29. if(empty($wiadomosc)) {
  30. $haslos = md5(sha1($_POST['haslos']));
  31. $haslo1 = md5(sha1($_POST['haslo1']));
  32. $haslo2 = md5(sha1($_POST['haslo2']));
  33. }
  34.  
  35. if(empty($_POST['haslos']) || empty($_POST['haslo1']) || empty($_POST['haslo2']))
  36.  
  37. {
  38. $has = mysql_query("SELECT * FROM uzytkownicy WHERE haslo='".$haslos."'");
  39. $has1 = mysql_num_rows($has);
  40.  
  41. if($has1 === 0) $wiadomosc .= "Stare has³o nie pasuje<br>";
  42. if($haslo1 != $haslo2) $wiadomosc .= "Has³a s± ró¿ne<br>";
  43. }
  44. if(empty($wiadomosc))
  45. {
  46.  
  47. $zapytanie1 = 'UPDATE `uzytkownicy` SET `haslo`= "'.$haslo2.'" WHERE `nick`="'.$user[id].'"';
  48. $idzapytania1 = mysql_query($zapytanie1) or die(mysql_error());
  49. $wiadomosc .= "has³o zosta³o zmienione<br>";
  50. }
  51. }
  52. echo $wiadomosc;
  53. ?>
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.