Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Edycja rekordu
Pcbecaw
post 20.01.2012, 17:19:46
Post #1





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

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


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
Go to the top of the page
+Quote Post
mortus
post 20.01.2012, 18:25:32
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
Turson
post 20.01.2012, 21:18:37
Post #3





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Wystarczy funkcja update bazy danych.
A hasło pierw zakoduj md5
Go to the top of the page
+Quote Post
Pcbecaw
post 21.01.2012, 01:06:48
Post #4





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

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


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.
Go to the top of the page
+Quote Post
mortus
post 21.01.2012, 09:48:45
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
Pcbecaw
post 21.01.2012, 11:26:27
Post #6





Grupa: Zarejestrowani
Postów: 236
Pomógł: 0
Dołączył: 4.06.2011

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


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. ?>
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: 18.06.2025 - 06:33