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.
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();
?>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
- Creare un cookie contenente il proprio nome e visualizzarlo in una pagina PHP successiva.
- Creare un cookie contenente la lingua preferita dell’utente e visualizzare un messaggio diverso in base alla lingua scelta.
- Creare una pagina che permetta di modificare ed eliminare un cookie mantenendo coerenti le opzioni
path,httponlyesamesite. - Creare una sessione nella quale salvare il nome e la classe dello studente, quindi visualizzare tali informazioni in una seconda pagina.
- Creare un semplice sistema di autenticazione simulato che memorizzi nella sessione il nome dell’utente e un valore booleano, senza salvare la password.
- Creare una pagina di logout che svuoti
$_SESSION, elimini il cookie di sessione e chiamisession_destroy().
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.