Lekcja 8 – Sesje i ciasteczka w PHP

Sesje i ciasteczka w PHP – wprowadzenie

Sesje i ciasteczka (cookies) są kluczowymi narzędziami, które umożliwiają przechowywanie i śledzenie informacji o użytkownikach na stronach internetowych. Dzięki nim możesz zapamiętać dane użytkownika między różnymi odwiedzinami strony lub nawet między różnymi sesjami przeglądarki. W tej lekcji omówimy, jak działają sesje i ciasteczka, jakie są ich zalety i w jaki sposób używać ich w PHP.

Czym są ciasteczka (cookies)?

Ciasteczka to małe pliki tekstowe przechowywane na komputerze użytkownika, które mogą zawierać informacje na temat preferencji użytkownika, danych logowania lub innych danych użytkownika. Ciasteczka są wysyłane przez serwer do przeglądarki użytkownika i przechowywane przez określony czas.

Tworzenie ciasteczka w PHP

Ciasteczka w PHP są tworzone za pomocą funkcji setcookie(). Możemy ustawić nazwę ciasteczka, jego wartość oraz dodatkowe parametry, takie jak czas wygaśnięcia, ścieżka czy domena.

Przykład tworzenia ciasteczka:

<?php
  // Tworzenie ciasteczka o nazwie "uzytkownik", które wygaśnie za 1 godzinę
  setcookie("uzytkownik", "Jan Kowalski", time() + 3600, "/");
  echo "Ciasteczko zostało ustawione.";
?>

Wyjaśnienie parametrów:

  • “uzytkownik”: Nazwa ciasteczka.
  • “Jan Kowalski”: Wartość ciasteczka.
  • time() + 3600: Ciasteczko wygaśnie za godzinę (3600 sekund).
  • “/”: Ciasteczko będzie dostępne dla całej domeny.
Odczytywanie ciasteczek

Aby odczytać wartości ciasteczka, używamy superglobalnej tablicy $_COOKIE. Jeśli ciasteczko istnieje, możemy uzyskać do niego dostęp za pomocą jego nazwy.

Przykład odczytu ciasteczka:

<?php
  if (isset($_COOKIE['uzytkownik'])) {
    echo "Cześć, " . $_COOKIE['uzytkownik'];
  } else {
    echo "Nie ustawiono ciasteczka.";
  }
?>
Usuwanie ciasteczek

Aby usunąć ciasteczko, ustawiamy jego czas wygaśnięcia w przeszłości, co powoduje, że przeglądarka automatycznie je usunie.

Przykład usunięcia ciasteczka:

<?php
  setcookie("uzytkownik", "", time() - 3600, "/");
  echo "Ciasteczko zostało usunięte.";
?>

Czym są sesje?

Sesje są sposobem na przechowywanie informacji o użytkowniku na serwerze przez czas trwania wizyty na stronie. Sesje różnią się od ciasteczek tym, że dane są przechowywane po stronie serwera, a nie w przeglądarce użytkownika. PHP automatycznie generuje dla każdego użytkownika unikalny identyfikator sesji (ID), który jest przechowywany w ciasteczku.

Rozpoczynanie sesji w PHP

Aby rozpocząć sesję, musimy użyć funkcji session_start(). Ta funkcja inicjuje sesję i tworzy superglobalną tablicę $_SESSION, w której możemy przechowywać informacje.

Przykład rozpoczęcia sesji i przechowywania danych w sesji:

<?php
  session_start();
  $_SESSION['imie'] = "Jan";
  $_SESSION['wiek'] = 25;
  echo "Sesja została rozpoczęta i dane zostały zapisane.";
?>
Odczytywanie danych z sesji

Po zapisaniu danych w sesji, możemy je odczytać na innych stronach, pod warunkiem, że sesja została wcześniej rozpoczęta za pomocą session_start().

Przykład odczytu danych z sesji:

<?php
  session_start();
  
  if (isset($_SESSION['imie']) && isset($_SESSION['wiek'])) {
    echo "Witaj, " . $_SESSION['imie'] . ". Masz " . $_SESSION['wiek'] . " lat.";
  } else {
    echo "Nie ustawiono danych sesji.";
  }
?>
Usuwanie danych z sesji

Aby usunąć dane z sesji, możemy użyć funkcji unset() do usunięcia konkretnej zmiennej sesji lub session_destroy() do zakończenia całej sesji.

Przykład usuwania zmiennej sesji:

<?php
  session_start();
  unset($_SESSION['imie']); // Usunięcie konkretnej zmiennej sesji
  echo "Zmienna sesji 'imie' została usunięta.";
?>

Przykład zakończenia sesji:

<?php
  session_start();
  session_destroy(); // Zakończenie sesji
  echo "Sesja została zakończona.";
?>

Korzystanie z sesji i ciasteczek w praktyce

Przykład logowania użytkownika za pomocą sesji

W praktyce sesje są często wykorzystywane do zarządzania logowaniem użytkowników. Oto prosty przykład logowania użytkownika z wykorzystaniem sesji:

Formularz logowania:

<form action="login.php" method="post">
  Nazwa użytkownika: <input type="text" name="username"><br>
  Hasło: <input type="password" name="password"><br>
  <input type="submit" value="Zaloguj">
</form>

Plik login.php, który sprawdza dane logowania i inicjuje sesję:

<?php
  session_start();

  // Przykładowe dane do logowania
  $prawidlowy_username = "admin";
  $prawidlowe_haslo = "12345";

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    if ($username == $prawidlowy_username && $password == $prawidlowe_haslo) {
      $_SESSION['username'] = $username;
      echo "Zalogowano pomyślnie. Witaj, " . $_SESSION['username'] . "!";
    } else {
      echo "Nieprawidłowe dane logowania.";
    }
  }
?>

Teraz, gdy użytkownik się zaloguje, możemy uzyskać dostęp do jego danych na innych stronach:

<?php
  session_start();

  if (isset($_SESSION['username'])) {
    echo "Zalogowany jako: " . $_SESSION['username'];
  } else {
    echo "Użytkownik nie jest zalogowany.";
  }
?>
Przykład zarządzania preferencjami użytkownika za pomocą ciasteczek

Ciasteczka są często wykorzystywane do zapisywania preferencji użytkownika, takich jak wybrany motyw strony, preferencje językowe czy ustawienia wyświetlania.

Przykład ustawienia preferencji językowej za pomocą ciasteczka:

<form action="ustawienia.php" method="post">
  Wybierz język:
  <select name="jezyk">
    <option value="pl">Polski</option>
    <option value="en">Angielski</option>
  </select>
  <input type="submit" value="Zapisz">
</form>

Plik ustawienia.php, który zapisuje wybrany język w ciasteczku:

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $jezyk = $_POST['jezyk'];
    setcookie("jezyk", $jezyk, time() + (86400 * 30), "/"); // Ciasteczko na 30 dni
    echo "Preferencje językowe zostały zapisane.";
  }
?>

Plik, który odczytuje preferencje językowe:

<?php
  if (isset($_COOKIE['jezyk'])) {
    if ($_COOKIE['jezyk'] == "pl") {
      echo "Wybrano język: Polski";
    } else {
      echo "Wybrano język: Angielski";
    }
  } else {
    echo "Nie ustawiono preferencji językowych.";
  }
?>

Bezpieczeństwo sesji i ciasteczek

Zarówno sesje, jak i ciasteczka mogą być narażone na różne zagrożenia, takie jak ataki typu session hijacking (przejęcie sesji) czy XSS (cross-site scripting). Aby zwiększyć bezpieczeństwo:

1. Używaj httponly dla ciasteczek: Ustawiając ciasteczka z opcją httponly, zapobiegasz ich odczytywaniu przez skrypty JavaScript, co zmniejsza ryzyko ataków XSS.Przykład:

setcookie("uzytkownik", "Jan", time() + 3600, "/", "", false, true);

2. Zabezpieczaj dane sesji: Upewnij się, że dane w sesji są bezpieczne, np. przechowuj hasła w postaci zaszyfrowanej, a nie w czystym tekście.

3. Regeneruj identyfikator sesji po zalogowaniu: Aby uniknąć przejęcia sesji, warto zregenerować identyfikator sesji po zalogowaniu użytkownika.

session_regenerate_id(true);

Podsumowanie

W tej lekcji nauczyliśmy się, jak działać z sesjami i ciasteczkami w PHP. Sesje umożliwiają przechowywanie informacji o użytkownikach na serwerze podczas trwania wizyty na stronie, natomiast ciasteczka pozwalają na przechowywanie danych w przeglądarce użytkownika przez dłuższy czas. Dzięki tym narzędziom możemy tworzyć bardziej interaktywne i spersonalizowane aplikacje webowe.

Gratulacje! Ukończyłeś lekcję 8.
Przejdź teraz do lekcji 9 >> Podstawy operacji na bazach danych MySQL z PHP


Spis Treści - darmowy kurs PHP

Wprowadzenie: Instalacja środowiska PHP
Lekcja 1: Podstawy składni PHP
Lekcja 2: Funkcje i instrukcje warunkowe w PHP
Lekcja 3: Pętle w PHP
Lekcja 4: Tablice w PHP
Lekcja 5: Dodatkowe podstawy funkcji w PHP
Lekcja 6: Praca z formularzami HTML w PHP
Lekcja 7: Obsługa plików w PHP
Lekcja 8: Sesje i ciasteczka w PHP
Lekcja 9: Podstawy operacji na bazach danych MySQL z PHP
Lekcja 10: Prepared Statements w PHP i bezpieczeństwo aplikacji
Lekcja 11: Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP
Lekcja 12: Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Lekcja 13: Zaawansowane techniki pracy z bazami danych w PHP
Lekcja 14: Testowanie jednostkowe w PHP z PHPUnit
Lekcja 15: Tworzenie i korzystanie z API RESTful w PHP
Lekcja 16: Obsługa plików JSON i XML w PHP

Dodatki
- Spis najważniejszych funkcji PHP