Le sessioni PHP: una guida completa
Scopri come funzionano le sessioni PHP, come memorizzare e recuperare i dati di sessione e come proteggere le sessioni da attacchi di fixation e hijacking.
HTTP è stateless — ogni richiesta che il browser invia è indipendente e il server dimentica tutto una volta inviata la risposta. Le sessioni sono il modo in cui PHP ricorda un visitatore tra una richiesta e l'altra: consentono di mantenere un utente connesso, costruire un carrello degli acquisti o ricordare preferenze mentre l'utente naviga da pagina a pagina. Questa guida illustra cosa sono le sessioni, come funzionano internamente, come leggere e scrivere dati di sessione e come mantenerle sicure.
Cosa sono le sessioni PHP?
Una sessione PHP è un meccanismo per memorizzare dati per singolo utente lato server per la durata della visita di un utente. A differenza dei cookie, che memorizzano i dati nel browser, una sessione conserva i dati effettivi sul server e invia al browser solo un piccolo ID di sessione per identificare a chi appartengono i dati.
Questo è importante per due motivi:
- Capacità — i cookie sono limitati a circa 4 KB e risiedono nel browser; i dati di sessione risiedono nello storage del server (file, database o memoria) e possono essere molto più grandi.
- Sicurezza — i valori sensibili (ID utente, ruolo o contenuto del carrello) non lasciano mai il server, quindi il browser non può leggerli né modificarli. Solo l'opaco ID di sessione viene esposto.
Come funzionano le sessioni PHP?
Quando una sessione viene avviata, PHP genera un ID di sessione univoco per il visitatore e lo invia al browser tramite un cookie chiamato PHPSESSID. Ad ogni richiesta successiva il browser restituisce quel cookie, e PHP utilizza l'ID per recuperare i dati corrispondenti memorizzati sul server. I dati stessi sono esposti al codice come array $_SESSION.
Flusso di lavoro della sessione
graph LR
A[Browser] -- 1. Request + Session Cookie --> B[Server]
B -- 2. Validate Cookie & Fetch Data --> A
A -- 3. Receive Response --> BIn sintesi: il cookie porta l'ID; il server conserva i dati.
Avviare una sessione
Ogni pagina che legge o scrive dati di sessione deve chiamare session_start() prima che venga inviato qualsiasi output al browser. Poiché session_start() invia il cookie PHPSESSID tramite un header HTTP, anche un singolo spazio o riga vuota prima del tag di apertura <?php causerà un avviso "headers already sent" e interromperà la sessione.
Chiamare session_start() riprende la sessione esistente del visitatore (se il browser ha inviato un ID valido) oppure ne avvia una nuova. Proteggere la chiamata con session_status() evita un avviso se la sessione era già stata avviata in precedenza nella richiesta:
Come avviare una sessione PHP
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}Lettura e scrittura dei dati di sessione
Una volta avviata una sessione, la superglobale $_SESSION si comporta come qualsiasi altro array associativo. Assegna un valore a una chiave per memorizzarlo:
Memorizza dati in una sessione PHP
<?php
$_SESSION['username'] = 'John Doe';
$_SESSION['cart'] = ['book', 'pen'];Leggili nella stessa pagina o in qualsiasi richiesta successiva all'interno della stessa sessione:
Recupera dati da una sessione PHP
<?php
// Always check the key exists to avoid a warning
$username = $_SESSION['username'] ?? 'Guest';
echo "Welcome, {$username}";Poiché i dati persistono tra le richieste, un pattern comune è un contatore di visualizzazioni di pagina che sopravvive ai ricaricamenti:
Conta le visualizzazioni di pagina nella sessione corrente
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$_SESSION['views'] = ($_SESSION['views'] ?? 0) + 1;
echo "You have viewed this page {$_SESSION['views']} time(s).";Per rimuovere un singolo valore, usa unset() sulla sua chiave — non assegnare null, che lascia la chiave al suo posto:
<?php
unset($_SESSION['cart']);Sessioni vs. Cookie
Le sessioni e i cookie spesso lavorano insieme, ma memorizzano i dati in posti diversi. Opta per una sessione quando i dati sono sensibili o di grandi dimensioni; opta per un cookie quando il browser stesso deve ricordare qualcosa (come un token "ricordami") tra le visite.
| Sessione | Cookie | |
|---|---|---|
| Memorizzato su | Server | Browser |
| Visibile all'utente | No (solo l'ID) | Sì |
| Limite di dimensione | Grande (storage del server) | ~4 KB |
| Durata | Fino alla chiusura del browser o al timeout | Scadenza configurabile |
Proteggere le sessioni PHP
È importante proteggere le sessioni PHP per impedire accessi non autorizzati ai dati sensibili degli utenti. Puoi proteggere le tue sessioni PHP in vari modi:
- Rigenera periodicamente l'ID di sessione.
- Memorizza i dati di sessione lato server in una directory sicura.
- Usa HTTPS per proteggere la trasmissione dei dati di sessione.
Rigenera l'ID di sessione e rafforza il cookie
Le opzioni di rafforzamento devono essere impostate prima di session_start(), altrimenti il cookie è già stato inviato con le vecchie impostazioni. Rigenerare l'ID subito dopo un cambio di privilegi (come un login) neutralizza gli attacchi di session fixation, in cui un aggressore inganna la vittima affinché utilizzi un ID di sessione che l'aggressore già conosce:
<?php
// Configure before the session starts
ini_set('session.cookie_secure', '1'); // send cookie over HTTPS only
ini_set('session.use_only_cookies', '1'); // never accept the ID from the URL
ini_set('session.cookie_httponly', '1'); // hide the cookie from JavaScript
session_start();
// After a successful login, swap the ID and discard the old one
session_regenerate_id(true);| Impostazione | Cosa previene |
|---|---|
cookie_secure | Fuga dell'ID di sessione su HTTP non cifrato |
cookie_httponly | Furto del cookie da parte di JavaScript (XSS) |
use_only_cookies | ID di sessione passati tramite URL |
session_regenerate_id | Session fixation dopo un login |
Terminare una sessione PHP
Per disconnettere un utente, cancella i dati e distruggi la sessione. Svuotare $_SESSION rimuove le variabili; session_destroy() elimina i dati sul server; eliminare il cookie impedisce al browser di inviare l'ID non aggiornato:
<?php
session_start();
// 1. Clear all session variables
$_SESSION = [];
// 2. Delete the session cookie in the browser
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
// 3. Destroy the data stored on the server
session_destroy();Conclusione
In conclusione, le sessioni PHP sono uno strumento essenziale per memorizzare i dati degli utenti lato server e migliorare l'esperienza utente sul tuo sito web. Comprendendo come funzionano e come utilizzarle, puoi sfruttare appieno i vantaggi che offrono. Con le adeguate misure di sicurezza in atto, puoi anche garantire che i dati sensibili degli utenti siano protetti.