Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Prosty mechanizm logowania z zastosowaniem sesji
Forum PHP.pl > Forum > Przedszkole
MGreg
Witam,
Nie znam się dobrze na php, więc nie atakujcie mnie jak coś jest nie tak.
Zobaczcie czy ten skrypcik logowania z zastosowaniem sesji jest sensowny i co najważniejsze - bezpieczny.

Nie zwracajcie uwagi na to, że dane użytkownika są pobierane z tabeli bazy forum phpbb, to tylko przykład.
Najlepiej jakby ktoś zarzucił to sobie na localhosta i posprawdzał dokładnie.
Z góry dzięki.
  1. <?
  2. include('baza.php');
  3. pol_mysql();
  4.  
  5.  
  6. $user_ip = $_SERVER['REMOTE_ADDR'];
  7. $time = date('H:i');
  8.  
  9. $sesja_anim = md5($user_ip.$time); #sesja użytkownika anonimowego
  10. $sesja_uzytkownika = md5($user.$pass.$time.$user_ip);
  11.  
  12. if(!isset($_SESSION['uzytkownik']))
  13. {
  14. $_SESSION['uzytkownik'] = $sesja_anim; #inicjuje sesję użytkownika anonimowego
  15. echo "została zinicjowana sesja użytkownika anonimowego<br>";
  16. }
  17.  
  18.  
  19. if($_SERVER['REQUEST_METHOD'] == 'POST')
  20. {
  21. $login = $_POST['login'];
  22. $haslo = md5($_POST['password']);
  23.  
  24. if($_POST['login'] and !$_POST['password'])
  25. {
  26. echo "Musisz podać hasło!";
  27. }
  28.  
  29. if(!$_POST['login'] and $_POST['password'])
  30. {
  31. echo "Musisz podać login!";
  32. }
  33.  
  34. if(!$_POST['login'] and !$_POST['password'])
  35. {
  36. echo "Nie wypełniono pól!";
  37. }
  38. if($_POST['login'] and $_POST['password'])
  39. {
  40.  
  41. $pobierz_usera = mysql_query("select username,user_password from phpbb_users where `username`='$login'");
  42. while($napisz_usera = mysql_fetch_row($pobierz_usera))
  43. {
  44. $user = $napisz_usera[0];
  45. $pass = $napisz_usera[1];
  46. }
  47.  
  48. if($login != $user)
  49. {
  50. echo "Nie ma takiego użytkownika";
  51. }
  52.  
  53. else
  54. {
  55. if($pass == $haslo)
  56. {
  57. $_SESSION['uzytkownik'] = $sesja_uzytkownika;
  58. $sesja_anim = "";
  59. echo "Zalogowany jako $user <br> <a href=logowanie.php?akcja=wyloguj>Wyloguj</a>";
  60. }
  61. else
  62. {
  63. echo "podano złe hasło!";
  64. }
  65. }
  66.  
  67. }
  68. }
  69.  
  70. if($_SESSION['uzytkownik'] == $sesja_anim)
  71. {
  72. echo "<form action=logowanie.php method=post>
  73. <input type=text name=login><br>
  74. <input type=text name=password><br>
  75. <input type=submit value=\"Zaloguj\">
  76. </form>
  77. ";
  78. }
  79.  
  80.  
  81.  
  82. if($akcja == 'wyloguj')
  83. {
  84. $sesja_uzytkownika = "";
  85. $_SESSION['uzytkownik'] = $sesja_anim;
  86. echo "Zostałeś wylogowany<br><a href=logowanie.php>Wróć</a>";
  87. }
  88.  
  89. ?>
Cysiaczek
Popraw proszę tytuł topiku na zgodny z zasadami forum Przedszkole
Petermechanic
Skrypt nie jest do końca bezpieczny, jest narażony na SQL Injection. Szczególnie pobieranie użytkownika po nicku. Nie zabezpieczyłeś niczym $_POST['login']
MGreg
Pisząc to nie skupiałem się na zebezpieczeniu zapytań, ale dzięki winksmiley.jpg Teraz pozostaje tylko sprawa bezpieczeństwa sesji.
Petermechanic
sesje jako tako same nie są narażone na atak, chyba, że ktoś z tego samych ustawień serwera przechwyci cookie i tym samym id sesji, albo sesja ma czas życia i zachowuje się po resecie przeglądarki - można ją łatwo wykraść
Pilsener
Ale warto się zabezpieczyć, używać takich rzeczy jak:
ini_set('session.use_only_cookies', true);
output_add_rewrite_var
session_regenerate_id

Identyfikatory sesji powinny być przekazywane tylko przez cookie - warto to wymusić. Dodatkowo można też dodać dodatkowy znacznik sesji, który będzie przekazywany w adresie URL. Dałbym link do jakiegoś praktycznego przykładu, niestety nie znalazłem takiego (ale może słabo szukałem winksmiley.jpg
mag32
Taka drobna uwaga. Wydaje mi się, że nie powinieneś zwracać komunikatu o błędzie hasła lub loginu, jeśli już, to komunikat o błędzie jednego lub drugiego.
Czyli: "Zły login lub hasło"

To taka drobniutka uwaga.
help_mee
Tak jak powiedział Petermechanic zabezpiecz to przed SQL Injection.
Najlepiej
  1. <?php
  2. $login = addslashes($_POST['login']);
  3. ?>
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.