# 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**: 1. **Creazione della sessione**: il server genera un identificatore di sessione univoco e lo invia al client come cookie. 2. **Memorizzazione dei dati**: le informazioni di sessione vengono salvate sul server e sono accessibili tramite l'identificatore. 3. **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 <?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 <?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 <?php session_start(); // Rimuovere una variabile di sessione unset($_SESSION['username']); ?> ``` **Esempio per distruggere la sessione**: ```php <?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 cookie `PHPSESSID` rimane 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 `Secure`** nei 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 <?php session_start(); session_regenerate_id(true); // Rigenera l'ID di sessione e cancella quello precedente ?> ```