ott
15
2009

Gestione sessioni in php

closeQuesto articolo è stato pubblicato 2 anni 3 mesi 28 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi. Questo sito non è responsabile per eventuali errori causati da questo problema.

Ci sono decine e decine di articoli in giro per il web che parlano di sessioni in php ma ho deciso di scriverne uno per appuntare un po’ di informazioni raccolte negli anni e riassumere i passaggi che ormai, bene o male, effettuo quando programmo in php.

Innanzitutto è impensabile di chiamare a mano in ogni pagina session_start() quindi innanzitutto è utile realizzare un file php dedicato dove raggrupperemo varie impostazioni relative alla sessione.

Ecco un esempio del file:

//durata della sessione
$minuti=30;
//cambio la directory di default del salvataggio sessioni
ini_set(“session.save_path”,dirname($_SERVER['SCRIPT_FILENAME']).”/CARTELLA PERSONALIZZATA”);
//setto la durata della sessione lato server
ini_set(“session.gc_maxlifetime”,60*$minuti);
//setto la durata del cookie lato client
ini_set(“session.cookie_lifetime”,60*$minuti);
// Inizializza la sessione se non e’ stata gia’ avviata
if(session_id() == “”)
session_start();
//Rigenero l’id di sessione ad ogni nuovo accesso
if(!isset($_SESSION['is_valid'])){
session_regenerate_id(true);
$_SESSION['is_valid'] = true;
}

Descriviamo dall’inizio le varie funzioni utilizzate.
Per prima cosa settando un path personalizzato per la sessione evitiamo che vengano memorizzate in /tmp e inoltre possiamo personalizzare la durata bypassando le impostazioni di default del garbage collector di php.
La chiamata a dirname($_SERVER['SCRIPT_FILENAME']) serve ad avere il path assoluto della cartella delle sessioni, visto che save_path vuole un path di questo tipo.

Le due impostazioni gc_maxlifetime e cookie_lifetime settano rispettivamente il numero di secondi dopo il quale verranno cancellati i dati dal server e il numero di secondi dopo il quale scadrà il cookie. I due numeri dovrebbero corrispondere. In questo modo stiamo dicendo al server di conservare la sessione per un determinato periodo di tempo e, per la stessa durata, deve esserci anche il cookie sul browser. In questo modo, finché ci sarà il cookie, ogni volta che il browser farà un check troverà una sessione valida.

Poi c’è la chiamata a session_start che effettivamente avvia la sessione ma solo nel caso in cui non ne sia già avviata una. Questo controllo è molto utile nel caso in cui si includa il file più volte in diversi punti del sito, evitando chiamate inutili a session_start.

L’ultima parte, molto utile per la sicurezza, serve per rigenerare l’id di sessione ad ogni nuova inizializzazione. Questo fa si che se c’è un vecchio identificativo non verrà riutilizzato per un eventuale nuovo utente. Il parametro true della funzione session_regenerate_id serve per cancellare anche fisicamente il file dal disco. Utile per tenere sempre pulita la cartella delle sessioni.
Il controllo sul parametro is_valid serve per non rigenerare l’id di sessione quando è stato già fatto. Questo permette di tenere lo stesso id per lo stesso utente finché non fa logout.

Oltre al lato php ci sono un paio di impostazioni da tenere in conto a livello web server. Infatti è importantissimo ai fini della sicurezza dare due impostazioni ad apache: non permettere l’accesso alla cartella delle sessioni, forzare ad usare i cookie per le sessioni. Queste impostazioni si possono settare nel file .htaccess o nel file di configurazione di apache/php.

Il primo  è necessario, altrimenti si possono leggere i file delle sessioni come semplici file di testo aprendoli nel browser. La direttiva apache da usare è la seguente:

order allow,deny
deny from all

Il secondo invece è necessario per far si che php non propaghi l’id di sessione tramite parametro get che apre le porte a numerosi attacchi. Forzando l’uso dei cookie l’id di sessione sarà sempre memorizzato nel browser. L’impostazione da settare in php.ini è la seguente:

session.use_only_cookies = 1

Questo è quanto. Domani scriverò un appunto sul logout e come cancellare una sessione.

Leave a comment

*