Sessioni PHP: cosa sono e come funzionano

Sessioni PHP: cosa sono e come funzionano, casi d'uso ed esempi

Sebbene PHP consenta di memorizzare lo stato utente tra una pagina web e l'altra attraverso i cookie, questo meccanismo presenta problemi di sicurezza.

Infatti, poiché i cookie sono memorizzati sul computer dell'utente, è possibile che un utente malintenzionato modifichi facilmente questi dati al fine di compromettere l'intera applicazione.

Un modo alternativo per rendere accessibili i dati in maniera permanente attraverso le pagine di un sito web, consiste nell'utilizzare una sessione PHP.

Prima di dare uno sguardo a come implementare le sessioni in PHP, vediamo innanzitutto cosa sono, come funzionano e in quali scenari utilizzare questo meccanismo di memorizzazione.

Cosa sono le sessioni e come funzionano in PHP

Le sessioni sono un insieme di informazioni memorizzate in un file che si trova sul server dove gira la nostra applicazione.

Quando viene avviata una sessione, PHP crea un identificatore univoco per quella particolare sessione, denominato PHPSESSID e rappresentato da una stringa casuale generata tramite una funzione di hash.

Allo stesso modo, viene creato e memorizzato sul server un file temporaneo all'interno di una directory designata al salvataggio delle sessioni.

Quando uno script PHP desidera recuperare il valore da una variabile di sessione, PHP preleva il valore dell'identificatore di sessione PHPSESSID e lo confronta con quello memorizzato sul server per vedere se sono uguali. In caso affermativo la sessione continua, altrimenti viene interrotta.

Una sessione può anche terminare quando l'utente chiude il browser o dopo aver fatto il logout dalla propria area riservata, oppure si interrompe automaticamente dopo un certo periodo di inattività.

Nota: La posizione della directory contenente i file di sessione è determinata da un'impostazione del file php.ini chiamata session.save_path.

Casi d'uso

Le sessioni PHP vengono utilizzate per implementare soprattutto le seguenti funzionalità:

  • Area riservata sito: nella gestione di un sistema di autenticazione tramite login e password, si è soliti creare una variabile di sessione da utilizzare in tutte le pagine che devono mostrare un contenuto protetto.
  • Carrello spesa sito eCommerce: tramite sessioni è possibile tenere traccia dei prodotti inseriti nel carrello tra una pagina e l'altra, continuando la navigazione del sito fino al checkout.
  • Messaggi flash: dopo un'operazione di modifica dei dati di un'applicazione (creazione, modifica, etc...) si è soliti redirezionare l'utente ad una pagina che mostri un messaggio temporaneo di errore o successo. Con le sessioni è possibile farlo in maniera semplice.

Vediamo adesso come creare una sessione e come accedere ai dati di quella sessione, modificarli oppure cancellarli del tutto.

Inizializzare una sessione

Per memorizzare un dato in una sessione in PHP è necessario inizializzare la sessione richiamando la funzione session_start() all'inizio dello script.

Nota: la funzione session_start() deve essere presente in ciascuno script PHP in cui vogliamo gestire le sessioni.

Una volta che la sessione è inizializzata, è possibile utilizzare la variabile superglobale $_SESSION per memorizzare variabili di sessione. Questa non è altro che un array associativo, quindi è sufficiente specificare un indice, che sarà il nome della variabile di sessione, e un valore.

Vediamo un esempio di utilizzo

session_start();

$_SESSION['username'] = 'rs200';

In questo caso abbiamo assegnato un valore di tipo stringa alla variabile di sessione $_SESSION['username'].

Accedere ai dati di una sessione

Una volta creata una variabile di sessione, recuperarne il contenuto è molto semplice in quanto è possibile accedervi come se fosse un normale array associativo.

Modificando l'esempio precedente, possiamo scrivere

<?php
session_start();

if (!isset($_SESSION['username'])) {
    header('Location:login.php');
    exit;
} else {
    echo "Benvenuto utente ".$_SESSION['username'];
}

// Codice area riservata

Nello script appena visto eseguiamo un controllo sulla variabile $_SESSION['username']  per vedere se è stata inizializzata (funzione isset()).

In caso negativo l'utente viene redirezionato alla pagina di login, in caso positivo la navigazione nell'area riservata prosegue con la stampa di un messaggio.

Modificare i dati di una sessione

Per modificare una variabile di sessione è sufficiente sovrascrivere il suo contenuto, riassegnando un nuovo valore alla variabile

<?php
session_start();

$_SESSION['username'] = 'rs200';
$_SESSION['username'] = 'f40';

echo $_SESSION['username']; // Stampa f40

Terminare una sessione

Per terminare una sessione possiamo usare la funzione session_destroy() che distrugge completamente una sessione

<?php
session_start();

if (isset($_POST['logout'])) {
    session_destroy();
    header('Location:login.php');
    exit;
}

Nota: Prima di distruggere una sessione è necessario richiamare la funzione session_start().

Se è necessario eliminare il contenuto di una singola variabile di sessione senza far terminare la sessione stessa, è possibile utilizzare la funzione unset() in questo modo

<?php
session_start();

$_SESSION['username'] = 'rs200';
unset($_SESSION['username']);

if (!isset($_SESSION['username'])) {
    echo "La variabile di sessione non esiste più";
}

Per concludere questa guida sulle sessioni PHP, mettiamole a confronto con i cookie tramite una tabella

Sessioni Cookie
Le sessioni sono file memorizzati sul server che contengono informazioni sull'utente I cookie sono file memorizzati sul client che contengono informazioni sull'utente
La durata massima di una sessione è configurabile in secondi tramite la direttivasession.gc_maxlifetime del php.ini La durata massima del cookie viene impostata tramite la funzione setcookie(), aggiungendo un valore positivo al parametro $expire.
Es. setcookie("lang", "it", time() + 3600)
Le variabili di sessione vengono gestite tramite la superglobale $_SESSION I cookie vengono gestiti tramite la superglobale $_COOKIE
Prima di poter accedere alle variabili di sessione è necessario utilizzare session_start() Poiché risiedono sul computer utente, è possibile accedere ai cookie senza dover inizializzare nulla
Non ci sono limiti per quanto concerne la dimensione massima di una sessione. Dipende dallo spazio sul server. Ciascun cookie può avere una dimensione massima di 4KB
Per cancellare una variabile si usa unset(). Per distruggere una sessione si una session_destroy() Per cancellare un cookie è necessario impostare la durata con un valore che fa riferimento al passato. Es: setcookie("lang", "it", time() - 3600)
Una sessione termina alla chiusura del browser da parte dell'utente oppure automaticamente dopo che è passato un periodo di inattività in secondi pari al valore impostato in session.gc_maxlifetime Un cookie termina quando viene eliminato dall'utente tramite le impostazioni del browser oppure quando termina la durata impostata