Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Logowanie nie działa
Forum PHP.pl > Forum > Przedszkole
kezman
Cześć, piszę skrypt logowania i mam problem. Po kliknięciu w submit, strona tylko się odświeża - nie ma żadnych błędów, nie pisze, że login / hasło są nie poprawne, ani nie przenosi na podaną stronę. Proszę o pomoc.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Logowanie</title>
  6. </head>
  7. <body>
  8.  
  9. <?
  10. ini_set('display_errors',1);
  11.  
  12. require_once("config.php");
  13.  
  14. if(isset($_POST['submit'])){
  15.  
  16. $user = $_POST['user'];
  17.  
  18. $password = $_POST['password'];
  19.  
  20. $salt = 'NS9Wvi5t74j4xXdNXHAFhkj89GV7UKgy2FI3hwXDS4YX4TJqiTMaO8snxoCNGRR';
  21.  
  22. $hashed = md5($password.$salt);
  23.  
  24. $sql = mysql_query("SELECT * FROM kezman WHERE user='$user' AND password='$hashed'");
  25.  
  26. $num_rows = mysql_num_rows($sql);
  27.  
  28. if ($num_rows) {
  29.  
  30. header("location:blabla.html");
  31.  
  32. }
  33. else
  34. {
  35. $msg="Podane dane są nie poprawne !";
  36. }
  37. }
  38.  
  39. ?>
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47. <!-- Formularz -->
  48.  
  49. <div id="login">
  50.  
  51. <form id="panel" name="panel" method="post" action="index.php">
  52. <input name="user" type="text" id="user" /><br />
  53. <input name="password" type="password" id="password" /><br />
  54. <input name="singin" type="submit" id="submit" value="Sign in !" />
  55. </form>
  56.  
  57. </div>
  58.  
  59. <!-- Koniec formularza -->
  60.  
  61.  
  62.  
  63. </body>
  64. </html>
thek
Nazwa submita z tego co widzę powoduje błąd. Sprawdzasz
  1. if(isset($_POST['submit']))
ale przecież Twój submit ma name="singin" i to jej powinieneś użyć. A tak masz sytuację gdy sprawdzenie submita w zmiennej POST wywala Ci FALSE zawsze bo nie ma takiej zmiennej smile.gif Sprawdź to sobie dodając print_r lub else za sprawdzeniem submita w stylu: "Nie naciskano submita" winksmiley.jpg Wywalać Ci będzie to pewnie nawet gdy go będziesz naciskał.

EDIT: I tak będziesz miał błędy bo przed headerem posłałeś Doctype( i wszystko aż do znacznika body) do przeglądarki już. Wrzucaj do dopiero po sprawdzaniu czy dostałeś POST. Swoją drogą zmiennej $msg nigdzie nie wyświetlasz winksmiley.jpg
kezman
Dodałem sesje, naprawiłem submit, ale dzieje się tak samo. Myślę, że coś z sesjami nagrzebałem :/ :

  1. <?
  2. if(session_is_registered("done")){
  3. header("location:blabla.html");
  4.  
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml">
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  10. <title>Logowanie</title>
  11. </head>
  12. <body>
  13.  
  14. <?
  15. ini_set('display_errors',1);
  16.  
  17. require_once("config.php");
  18.  
  19. if(isset($_POST['signin'])){
  20.  
  21. $user = $_POST['user'];
  22.  
  23. $password = $_POST['password'];
  24.  
  25. $salt = 'NS9Wvi5t74j4xXdNXHAFhkj89GV7UKgy2FI3hwXDS4YX4TJqiTMaO8snxoCNGRR';
  26.  
  27. $hashed = md5($password.$salt);
  28.  
  29. $sql = mysql_query("SELECT * FROM kezman WHERE user='$user' AND password='$hashed'");
  30.  
  31. $num_rows = mysql_num_rows($sql);
  32.  
  33. if ($num_rows) {
  34.  
  35.  
  36. }
  37. else
  38. {
  39. echo "Podane dane są nie poprawne !";
  40. }
  41. }
  42. }
  43.  
  44. ?>
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52. <!-- Formularz -->
  53.  
  54. <div id="login">
  55.  
  56. <form id="panel" name="panel" method="post" action="index.php">
  57. <input name="user" type="text" id="user" /><br />
  58. <input name="password" type="password" id="password" /><br />
  59. <input name="signin" type="submit" id="signin" value="Sign in !" />
  60. </form>
  61.  
  62. </div>
  63.  
  64. <!-- Koniec formularza -->
  65.  
  66.  
  67.  
  68. </body>
  69. </html>
thek
Ustaw sobie wszystko po kolei. Sesję startujesz, robisz post, jeśli po poście "done" jest zarejestrowane to robisz redirecta, a jeśli nie to pójdzie dalej. Innymi słowy robisz sobie tak zwany diagram interakcji. Weź sobie logicznie na chłopski rozum rozpisz co się ma, kiedy i jak w skrypcie wykonywać czasowo. Wtedy zauważysz, że na logikę tak jest.
Startuje sesja dla pliku -> sprawdza się rejestracja przebiegła -> sprawdzasz post -> w zależności od post masz errory lub przekierowanie z ustawieniem na "done".
Tyle że sprawdzanie sesji wymagałoby dodatkowego jednego przebiegu więc musisz to przebudować.
Startuje sesja -> sprawdzasz post -> ustawiasz lub nie w sesji "done" -> jeśli "done" zarejestrowane to przekierowanie -> brak done oznacza błędy więc wyświetl je i formularz.
kezman
Bardzo dziękuję za to wytłumaczenie, na prawdę podbudowałeś mnie do ukończenia skryptu guitar.gif

Aktualnie wygląda to tak :

  1. <?
  2. ?>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <title>Logowanie</title>
  8. </head>
  9. <body>
  10.  
  11. <?
  12. ini_set('display_errors',1);
  13.  
  14. require_once("config.php");
  15.  
  16.  
  17.  
  18.  
  19.  
  20. if(isset($_POST['signin'])){
  21.  
  22. $user = mysql_escape_string($user);
  23.  
  24. $password = mysql_escape_string($password);
  25.  
  26. $salt = 'NS9Wvi5t74j4xXdNXHAFhkj89GV7UKgy2FI3hwXDS4YX4TJqiTMaO8snxoCNGRR';
  27.  
  28. $hashed = md5($password.$salt);
  29.  
  30. $sql = mysql_query("SELECT * FROM kezman WHERE user='$user' AND password='$hashed'");
  31.  
  32. $num_rows = mysql_num_rows($sql);
  33.  
  34. if ($num_rows) {
  35.  
  36.  
  37. echo "Działa !";
  38.  
  39. }
  40. else
  41. {
  42. echo "Podane dane są nie poprawne !";
  43. }
  44. }
  45.  
  46.  
  47. ?>
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. <!-- Formularz -->
  56.  
  57. <div id="login">
  58.  
  59. <form id="panel" name="panel" method="post" action="index.php">
  60. <input name="user" type="text" id="user" /><br />
  61. <input name="password" type="password" id="password" /><br />
  62. <input name="signin" type="submit" id="signin" value="Sign in !" />
  63. </form>
  64.  
  65. </div>
  66.  
  67. <!-- Koniec formularza -->
  68.  
  69.  
  70.  
  71. </body>
  72. </html>


Wszystko działa. Mam jednak pytanie. Czy skrypt jest bezpieczny/optymalny ? Jeśli nie to mógłbyś mi podać jakieś wskazówki ?
Dodałem coś takiego :

  1. $user = mysql_escape_string($user);
  2.  
  3. $password = mysql_escape_string($password);
thek
Mysql_escape_string jest oznaczona jako deprecated, czyli ma być wycofana i zamiast niej powinno się używać mysql_real_escape_string, ale poza tym masz jeden "mały" błąd... Nie sprawdzasz danych przychodzących z formularza. Strip_tags lub funkcja adekwatnie działająca w takim wypadku to niezbędne minimum. W ten sposób zabezpieczasz się przed wrzuceniem kodu html do pól formularza. Poczytaj artykuły o Cross Site Scripting (CSS, XSS) i wstrzyknięciu kodu (SQL Injection) - czyli innymi słowy bezpieczeństwie formularzy. Tutaj w portalu masz o tym trochę. Na przyszłość radziłbym Ci także używać apostrofu pojedynczego zamiast podwójnego. Jest to szybsze, bo nie uruchamia interpretera PHP szukającego w stringu zmiennych php smile.gif Przykład?
  1. $sql = mysql_query("SELECT * FROM kezman WHERE user='$user' AND password='$hashed'");

zamień na
  1. $sql = mysql_query('SELECT * FROM kezman WHERE user=\''.$user.'\' AND password=\''.$hashed.'\'');
Ważne by wiedzieć kiedy i jak chronić te apostrofy by były widziane odpowiednio. Stąd zauważ, że czasem muszę je "escapować". W sumie zastanawiam się czy de facto musze, ponieważ mysql_real_escape powinna otoczyć string apostrofami sama winksmiley.jpg Ale nigdy nie testowałem tongue.gif
kezman
Bardzo Ci dziękuję ! Pozdrawiam
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.