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.
Indice dei contenuti
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
.
Le sessioni PHP vengono utilizzate per implementare soprattutto le seguenti funzionalità:
Vediamo adesso come creare una sessione e come accedere ai dati di quella sessione, modificarli oppure cancellarli del tutto.
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']
.
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.
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
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 |