Sesje w PHP

Stronę tą wyświetlono już: 233 razy

Mechanizm sesji umożliwia przechowywanie ważnych danych, które będą dostępne na kolejnych podstronach tej samej domeny po stronie serwera. Aby zidentyfikować daną osobę korzystającą z strony tworzony jest identyfikator sesji, gdy ta nie została jeszcze zainicjalizowana. Do utworzenia sesji na samym początku kodu strony należy umieścić wywołanie funkcji session_start a następnie sprawdzić, czy superglobalna tablica $_SESSION została zainicjalizowana, jeżeli nie to należy wygenerować losowy identyfikator sesji za pomocą funkcji session_regenerate_id co zapobiegnie możliwości pominięcia mechanizmu logowania. Identyfikator sesji jest jedyną zmienną przechowywaną w pliku cookie po stronie użytkownika, a jego wykradnięcie może umożliwić podszycie się pod kogoś. Aby zapobiec temu warto zapamiętywać w sesji takie informacje jak: adres ip komputera oraz nazwa przeglądarki, z której użytkownik korzystał a następnie weryfikować te dane. Adres ip osoby odwiedzającej jest dostępny w tablicy $_SERVER['REMOTE_ADDR'].

Listing 1
  1. <?php
  2. session_start(); // rozpoczęcie sesji
  3. // Pseudo baza danych użytkowników
  4. $users = array( 1 => array('login' => 'user1', 'password' => password_hash('password1', PASSWORD_BCRYPT)),
  5. array('login' => 'user2', 'password' => password_hash('password2', PASSWORD_BCRYPT)),
  6. array('login' => 'user3', 'password' => password_hash('password3', PASSWORD_BCRYPT)));
  7. // funkcja sprawdzająca, czy dane logowania są poprawne
  8. function UserExist($login, $password){
  9. global $users;
  10. foreach($users as $id => $user){
  11. if($login == $user['login']){
  12. if(password_verify($password, $user['password'])){
  13. return $id;
  14. }else{
  15. echo("<p>Ty próbować, źle zalogować, hasło nie dobre, bardzo nie ładnie. Proszę je wpisać teraz poprawnie.</p>");
  16. return false;
  17. }
  18. }
  19. }
  20. return false;
  21. }
  22. if(isset($_POST['login']) && isset($_POST['password'])){ // sprawdzanie, czy dane do logowania zostały wysłane
  23. $id = UserExist($_POST['login'], $_POST['password']); // pozyskiwanie id użytkownika lub false gdy hasło i login są niepoprawne
  24. $_SESSION['id'] = $id ? $id : 0; // ustawianie id użytkownika
  25. $_POST = array();
  26. }else if(isset($_POST['logout'])){ // wylogowanie się
  27. $_SESSION = array(); // usuwanie danych
  28. if (isset($_COOKIE[session_name()])) {
  29. setcookie(session_name(), '', 0);
  30. }
  31. session_destroy();
  32. }
  33. if(!isset($_SESSION['initial'])){
  34. session_regenerate_id(true); // generowanie losowego id sesji
  35. $_SESSION['initial'] = true;
  36. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; // zapisywanie adresu ip
  37. $_SESSION['nr'] = 1; // licznik odwiedzin na 1
  38. $_SESSION['id'] = 0; // id użytkownika na 0
  39. }else{
  40. $_SESSION['nr'] += 1; // zwiększanie licznika odwiedzin
  41. }
  42. if(!$_SESSION['id']){ // jak id nie jest ustawione na wartość różną od 0 to trzeba wyświetlić formularz logowania
  43. echo("<form action='Sesje.php' method='POST'>");
  44. echo("<p>Login: <input type='text' name='login'/></p>");
  45. echo("<p>Password: <input type='password' name='password'/></p>");
  46. echo("<p><button type='submit'>Zaloguj</button></p>");
  47. echo("</form>");
  48. }else{ // w przeciwnym przypadku formularz wylogowania
  49. echo("<form action='Sesje.php' method='POST'>");
  50. echo("<input type='hidden' name='logout' value='logout' />");
  51. echo("<p><button type='submit'>Wyloguj</button></p>");
  52. echo("</form>");
  53. }
  54. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']){ // jak ip sesji się nie zgadza to kończymy zabawę
  55. die('Niestety mój stary Jedi przyjacielu, nie podszyjesz się pod niego!');
  56. }
  57. if($_SESSION['id'] > 0){
  58. echo("<p>Witaj: " . $users[$_SESSION['id']]['login'] . "</p>");
  59. }
  60. echo("Stronę nawiedziłeś już: " . $_SESSION['nr'] . " razy");
  61. ?>

Komentarze