5  Cookie e sessioni

5.3 Le sessioni

Le sessioni permettono di conservare informazioni durante la navigazione dell’utente, ma a differenza dei cookie i dati vengono memorizzati sul server.

Quando viene avviata una sessione, il server associa alla navigazione un identificatore chiamato session ID.

Il session ID viene normalmente memorizzato sul computer dell’utente tramite un cookie chiamato PHPSESSID.

I dati della sessione vengono invece memorizzati sul server e possono essere utilizzati nelle diverse pagine del sito attraverso l’array superglobale $_SESSION.

NotaNota

Nei cookie vengono memorizzati direttamente i dati sul computer dell’utente. Nelle sessioni i dati vengono invece mantenuti sul server; il browser conserva normalmente solamente il session ID che permette di identificare la sessione.

Avvio di una sessione

Per utilizzare le sessioni all’interno di una pagina PHP è necessario utilizzare la funzione session_start().

La funzione non richiede parametri e deve essere chiamata prima di qualsiasi output.

<?php
    
    session_start();
    
    ?>
AvvisoAttenzione

La funzione session_start() deve essere eseguita prima di inviare al browser qualsiasi codice HTML o altro output tramite funzioni come echo() e print().

Salvataggio dei dati nella sessione

Una volta avviata la sessione, è possibile salvare le informazioni all’interno dell’array superglobale $_SESSION.

Ad esempio:

<?php
    
    // Apro la sessione
    session_start();
    
// Recupero i dati inviati dal form.
$username = trim($_POST["user"] ?? "");

if ($username !== "") {
    // Dopo la verifica delle credenziali, rinnovo l'ID
    // per contrastare gli attacchi di session fixation.
    session_regenerate_id(true);

    $_SESSION['username'] = $username;
    $_SESSION['autenticato'] = true;
}
    
    ?>

In questo modo nella sessione vengono memorizzati il nome utente e lo stato di autenticazione. La password non deve essere conservata nella sessione.

Utilizzo dei dati della sessione

I dati salvati nella sessione possono essere recuperati anche da una pagina diversa.

È sufficiente richiamare nuovamente session_start() e accedere agli elementi dell’array $_SESSION.

<?php
    
    // Apro la sessione
    session_start();
    
$username = $_SESSION["username"] ?? null;

if ($username !== null) {
    echo "Ciao " . htmlspecialchars(
        $username,
        ENT_QUOTES | ENT_SUBSTITUTE,
        "UTF-8"
    );
} else {
    echo "Utente non autenticato";
}
    
    ?>

In questo modo le informazioni precedentemente salvate possono essere utilizzate nelle successive pagine del sito.

5.4 Eliminazione dei dati di sessione

PHP mette a disposizione diverse funzioni per eliminare le informazioni memorizzate in una sessione.

Eliminazione di una singola variabile

Per eliminare una specifica variabile di sessione si utilizza la funzione unset().

<?php
    
    unset($_SESSION['username']);
    
    ?>

In questo modo viene eliminata solamente la variabile username.

Eliminazione di tutte le variabili

Per eliminare tutte le variabili contenute nell’array $_SESSION si può utilizzare:

<?php
    
    session_unset();
    
    ?>

È inoltre possibile inizializzare nuovamente l’array della sessione:

<?php
    
    $_SESSION = array();
    
    ?>

Distruzione della sessione

session_destroy() elimina i dati associati alla sessione sul server, ma non svuota automaticamente $_SESSION e non elimina il cookie con il session ID. Per un logout completo si eseguono tutti i passaggi:

<?php
session_start();

$_SESSION = [];

if (ini_get("session.use_cookies")) {
    $parametri = session_get_cookie_params();

    setcookie(session_name(), "", [
        "expires" => time() - 42000,
        "path" => $parametri["path"],
        "domain" => $parametri["domain"],
        "secure" => $parametri["secure"],
        "httponly" => $parametri["httponly"],
        "samesite" => $parametri["samesite"] ?? "Lax"
    ]);
}

session_destroy();
?>

La differenza tra le operazioni è importante:

  • session_unset() azzera immediatamente il contenuto dell’array $_SESSION;
  • session_destroy() elimina i dati associati alla sessione sul server, ma da solo non modifica le variabili già caricate nello script e non elimina il cookie di sessione.

5.5 Esercizi

  1. Creare un cookie contenente il proprio nome e visualizzarlo in una pagina PHP successiva.
  2. Creare un cookie contenente la lingua preferita dell’utente e visualizzare un messaggio diverso in base alla lingua scelta.
  3. Creare una pagina che permetta di modificare ed eliminare un cookie mantenendo coerenti le opzioni path, httponly e samesite.
  4. Creare una sessione nella quale salvare il nome e la classe dello studente, quindi visualizzare tali informazioni in una seconda pagina.
  5. Creare un semplice sistema di autenticazione simulato che memorizzi nella sessione il nome dell’utente e un valore booleano, senza salvare la password.
  6. Creare una pagina di logout che svuoti $_SESSION, elimini il cookie di sessione e chiami session_destroy().
AvvisoIstruzioni di consegna

Consegnare ogni esercizio in un file PHP diverso e numerato. Inserire tutti i file in una cartella denominata cognome_nome e consegnarla in formato compresso.