Sessioni
Quale problema risolvono?
Le sessioni sono una soluzione al problema della persistenza dei dati tra le richieste HTTP, con un approccio più sicuro rispetto al solo utilizzo dei cookies. Sebbene i cookies siano utili per mantenere le informazioni lato client, come le preferenze o la lingua dell’utente, non sono adatti per memorizzare informazioni sensibili o gestire sessioni di login, poiché possono essere manipolati e letti facilmente dall’utente.
Problema della sicurezza lato client
Memorizzare tutte le informazioni relative a uno stato (ad esempio, dati di autenticazione o informazioni sul carrello) solo nei cookies lato client è rischioso per diverse ragioni:
- Manipolazione dei dati: i cookies possono essere modificati o letti dall’utente tramite strumenti del browser, consentendo potenzialmente attacchi come la falsificazione dell’identità.
- Riservatezza: memorizzare informazioni sensibili nei cookies espone dati che dovrebbero essere mantenuti riservati.
Come le sessioni risolvono questo problema
Le sessioni permettono di memorizzare i dati lato server, riducendo i rischi legati alla manipolazione e alla sicurezza. I dati relativi a una sessione utente vengono mantenuti sul server, mentre il client conserva solo un identificatore univoco di sessione, spesso sotto forma di un cookie chiamato PHPSESSID.
Meccanismo delle sessioni:
- Creazione della sessione: il server genera un identificatore di sessione univoco e lo invia al client come cookie.
- Memorizzazione dei dati: le informazioni di sessione vengono salvate sul server e sono accessibili tramite l’identificatore.
- Comunicazione con il client: ad ogni richiesta, il browser invia l’identificatore di sessione, consentendo al server di recuperare i dati associati.
Questo approccio permette di mantenere l’informazione sensibile lato server, proteggendo i dati da manipolazioni.
Implementazione delle sessioni utilizzando i cookies
Quando si utilizza una sessione, PHP crea automaticamente un cookie con l’identificatore di sessione (PHPSESSID) e lo invia al client. Questo cookie viene incluso automaticamente nelle richieste successive dal browser, consentendo al server di identificare la sessione e recuperare i dati salvati.
Utilizzo delle sessioni in PHP
PHP ha una gestione delle sessioni semplice e integrata. Ecco come implementarle:
Iniziare una sessione
Per iniziare una sessione in PHP, si utilizza la funzione session_start(), che deve essere chiamata prima di qualsiasi output HTML o contenuto.
Esempio:
<?php
// Inizia la sessione
session_start();
// Imposta una variabile di sessione
$_SESSION['username'] = 'Mario';
// Accedi ai dati della sessione
echo 'Ciao, ' . $_SESSION['username'];
?>
Cosa succede qui:
- PHP crea un identificatore univoco di sessione (se non esiste già) e lo invia al client come cookie
PHPSESSID. - I dati della sessione vengono salvati sul server e sono accessibili tramite l’array globale
$_SESSION.
Accesso ai dati di sessione
Le variabili di sessione possono essere lette in qualsiasi punto dello script dopo l’inizio della sessione.
Esempio:
<?php
session_start();
if (isset($_SESSION['username'])) {
echo 'Bentornato, ' . $_SESSION['username'];
} else {
echo 'Benvenuto, ospite!';
}
?>
3. Eliminare i dati di sessione
È possibile eliminare variabili di sessione specifiche con unset() o rimuovere completamente la sessione.
Esempio per rimuovere una variabile specifica:
<?php
session_start();
// Rimuovere una variabile di sessione
unset($_SESSION['username']);
?>
Esempio per distruggere la sessione:
<?php
session_start();
// Rimuovere tutte le variabili di sessione
session_unset();
// Distruggere la sessione
session_destroy();
echo 'La sessione è stata distrutta.';
?>
session_unset()rimuove tutte le variabili di sessione.session_destroy()distrugge la sessione, ma il cookiePHPSESSIDrimane sul client fino alla sua scadenza o eliminazione manuale.
Come funzionano internamente le sessioni in PHP
Quando un utente visita il sito, PHP crea un file di sessione sul server, solitamente in una cartella temporanea specificata dalla configurazione (session.save_path). Il file memorizza le informazioni associate a quell’identificatore di sessione.
Il cookie PHPSESSID viene inviato al browser, che lo include automaticamente nelle richieste successive. Il server utilizza questo ID per accedere al file di sessione corretto e leggere o modificare i dati.
Sicurezza delle sessioni
Per proteggere le sessioni:
session_regenerate_id(): usa questa funzione per rigenerare l’ID di sessione a intervalli regolari, specialmente dopo l’autenticazione, per prevenire attacchi di session fixation.- Imposta l’attributo
Securenei cookies se il sito utilizza HTTPS, in modo che l’ID di sessione non venga trasmesso in chiaro. - Limita l’accesso al cookie di sessione impostando
HttpOnly, che impedisce l’accesso al cookie tramite JavaScript, prevenendo attacchi XSS.
Esempio di rigenerazione dell’ID di sessione:
<?php
session_start();
session_regenerate_id(true); // Rigenera l'ID di sessione e cancella quello precedente
?>