Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Analisi delle sessioni in PHP: durata e serializzazione degli array

Come vengono utilizzate le sessioni PHP in applicazioni Web e come evitare di programmare codice insicuro. Approfondimento ed esempi d'uso
Come vengono utilizzate le sessioni PHP in applicazioni Web e come evitare di programmare codice insicuro. Approfondimento ed esempi d'uso
Link copiato negli appunti

Le sessioni sono uno degli strumenti più utilizzati durante lo sviluppo delle applicazioni in PHP, le procedure per inizializzare le sessioni, rigenerarne gli Id, utilizzarle per passare dati da una pagina all'altra e terminarle sono molto semplici; ma probabilmente non tutti sanno come queste funzionano realmente, come avviene il loro processo di memorizzazione e quali sono gli elementi che le costituiscono.

In questo breve articolo verrà approfondito l'argomento relativo ai meccanismi che permettono di utilizzare le sessioni all'interno di un'applicazione senza ignorare le problematiche relative alla sicurezza.

Generalmente con il termine sessione si intende un sistema di comunicazione tra un utente (inteso anche come unità logica) e un determinato applicativo o un servizio messo a disposizione da esso; sulla base di questo sistema utente e applicazione avranno un determinato periodo di tempo per potersi scambiare delle informazioni.

Non di rado, si utilizza lo stesso termine anche per indicare l'intervallo di tempo in cui lo scambio di informazioni avviene.

Una sessione è dotata di un proprio ciclo di vita delimitato da tre fasi:

  • inizializzazione: si tratta di una fase di avvio in cui iniziano le operazioni di scambio dei dati tra un client, provenienti quindi da un utente, e un'applicazione che gestisce un determinato servizio, questo avviene per esempio nel momento in cui si accede ad un'area riservata basata su procedura di autenticazione;
  • comunicazione (sessione di lavoro): in questa fase la sessione consente l'interscambio di dati tra un utente e un servizio, ciò è resa possibile dal fatto che durante l'inizializzazione il server alloca in memoria alcune informazioni chiamate "parametri di sessione", grazie ad essi l'applicazione è in grado di riconoscere l'utente corrente permettendogli di accedere ai dati scambiati e di manipolarli;
  • terminazione: ovvero la chiusura di una sessione che può avvenire anche su richiesta dell'utente come per esempio nelle procedure di "logout", essa consiste nella cancellazione delle informazioni di sessione; se l'applicazione lo prevede, una sessione può essere terminata anche da un periodo di latenza in cui non vengono scambiati dati tra utente e servizio.

Sessioni e cookie vengono spesso confusi per via del fatto che sono spesso utilizzati per finalità molto simili, in realtà vi è una grande differenza tra questi due strumenti, infatti, le sessioni vengono memorizzate lato server, mentre i cookie sono allocati lato client (dal browser di navigazione).

Il motivo per cui le sessioni vengono memorizzate in remoto è molto semplice, si tratta infatti di un accorgimento di sicurezza in quanto un server Web è certamente uno strumento più sicuro con cui gestire informazioni (spesso riservate), rispetto ad un comune browser per la navigazione su Internet.

Le sessioni utilizzano i cookie ma non sono la stessa cosa, semmai è giusto dire che i cookie sono uno strumento utilizzato dalle sessioni per ricondurre un determinato Id di sessione ai dati gestiti attraverso di esse.

Come funzionano le sessioni? I file di sessione

Per capire come funzionano le sessioni, è possibile partire da un esempio molto semplice d'inizializzazione:

session_start(); 
$_SESSION['sitoWeb'] = 'http://www.html.it';
$_SESSION['idSessione'] = session_id();

Nel particolare abbiamo che:

  • session_start() è una funzione che ha il compito di inizializzare una sessione, ma può essere utilizzata anche per riprendere una sessione corrente;
  • $_SESSION['sitoWeb'] è una variabile di sessione, introduce nell'array formato dalle informazioni di sessione (array associativo globale $_SESSION) un valore relativo all'URL della home page di un sito Web;
  • session_id() è una funzione che restituisce l'id (identificativo univoco) di sessione per la sessione corrente; nell'esempio, anche questo dato è stato passato come valore all'array contenente le informazioni di sessione.

Grazie alle tre semplici righe di codice mostrate in precedenza, è possibile creare un file di sessione che contiene tutte le informazioni relative alla sessione inizializzata; il nome di questo file sarà composto da due parti: un prefisso, sess_, seguito dall'identificativo della sessione:

sess_2869687853c5af8d7b0b57881dad8cc2

All'interno di questo file sarà possibile osservare una sequenza di valori che sono in pratica il prodotto delle informazioni archiviate durante l'apertura della sessione:

a:2:{s:7:"sitoWeb";s:18:"http://www.html.it";s:10:"idSessione";s:32:"2869687853c5af8d7b0b57881dad8cc2";}

La memorizzazione dei dati di sessione all'interno del relativo file avviene attraverso un processo denominato "serializzazione", esso consiste in pratica nel produrre una versione "archiviabile" (memorizzabile) di una sequenza di valori; gestire i valori singolarmente sarebbe complesso e oneroso in termini di risorse e di tempo, quindi si adotta una soluzione che consiste nella conversione di questi valori in un'unica stringa da allocare in memoria

Nel momento in cui le informazioni contenute all'interno del file di sessione devono essere messe a disposizione dei soggetti in comunicazione, queste stesse potranno essere recuperate attraverso l'Id di sessione e rese leggibili grazie ad una procedura di deserializzazione che consiste nel restituire una versione "leggibile" dei dati.

Il problema del Session Hijacking

Una delle domande più ricorrenti nei forum di supporto per gli sviluppatori PHP è la seguente: "le sessioni sono sicure?"; in precedenza è stato detto che uno dei punti di forza delle sessioni è quello di essere allocate lato server, questo fattore però non mette a riparo da tutti i possibili problemi di sicurezza, è necessario infatti sapere che esiste una pratica malevola appositamente dedicata alla violazione delle sessioni: il Session Hijacking.

Per session hijacking si intende un attacco in cui un utente cerca di appropriarsi dell'Id di sessione di un altro utilizzatore; l'identificatore di una sessione è molto più facile da rintracciare di quanto non si creda, infatti, riprendendo l'esempio fatto nel paragrafo precedente, questo potrà essere ottenuto sia stampando il relativo valore di sessione:

echo $_SESSION['idSessione'];

sia stampando il valore PHPSESSID presente all'interno dell'array relativo al cookie creato dalla sessione inizializzata:

echo $_COOKIE['PHPSESSID'];

Questo avviene per via del fatto che nel momento in cui viene aperta la sessione essa da origine ad un coockie che appunto raccoglie il valore relativo all'identificatore.

Esistono vari modi per rendere più difficile l'azione di coloro che tentano di sferrare attacchi di tipo Session Hijacking, uno di questi è per esempio agire sui dati conservati all'interno dell'array di sessione.

Si immagini per esempio di aver inserito tra i parametri di sessione anche quello relativi all'USER AGENT del client impiegato dall'utente:

$_SESSION['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];

Normalmente questo dato è disponibile "in chiaro", per ottenerlo basta effettuare una stampa della relativa variabile d'ambiente, ne consegue che anche la variabile di sessione a cui è associato questo valore sarà identificabile nello stesso modo.

È però possibile complicare il discorso passando la variabile d'ambiente ad una funzione per le stringhe come "md5()":

 $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

md5() produrrà un valore esadecimale composto da 32 caratteri che verrà poi associato al parametro di sessione, il tutto potrà essere fatto effettuando su di esso alcuni semplici controlli:

<?php
session_start(); 
if (isset($_SESSION['HTTP_USER_AGENT']))
{
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
    {
        exit;
    }
}
else
{
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}
?>

Come è semplice osservare, nello script proposto:

  • viene inizializzata la sessione attraverso la funzione session:_start();
  • viene controllata la presenza della variabile di sessione che contiene l'USER AGENT,
  • nel caso in cui il valore della variabile di sessione sia diverso da quello della variabile d'ambiente passata alla funzione md5() l'esecuzione dello script viene interrotta;
  • nel caso in cui la variabile di sessione non esiste, questa verrà creata passando la variabile d'ambiente alla funzione per la conversione delle stringhe.

Con questo semplice accorgimento l'utente malintenzionato non dovrà accedere soltanto al giusto Id di sessione, ma anche identificare la corretta intestazione USER AGENT associata al valore di sessione.

Rendendo più complicata la vita agli aggressori e complicando il loro lavoro sarà possibile nello stesso tempo rendere più sicure le proprie applicazioni.

Conclusioni

In questa breve trattazione è stato affrontato il discorso relativo alle sessioni, uno degli strumenti più utilizzati nello sviluppo in linguaggio PHP per l'interscambio si informazioni tra utenti e applicazioni.

In particolare sono stati analizzati aspetti come il funzionamento delle sessioni (specificandone le varie fasi del ciclo di vita), la loro composizione e le loro caratteristiche; sono infine stati introdotti alcuni accenni alla sicurezza con particolare attenzione al problema del Session Hijacking e alle possibili contromisure da adottare contro questo particolare tipo di attacco.


Ti consigliamo anche