Sessioni PHP: cosa sono, come si usano

4 maggio 2012

Com’è noto il protocollo HTTP che sovrintende tutte le connessioni web è stateless: non è in grado di tenere traccia di eventuali scelte o particolari dati trasmessi tra client e server. Per questa ragione in PHP è stato implementato un meccanismo di gestione delle sessioni, laddove per “sessione” si intendono tutte le interazioni avvenute tra browser e server fino alla chiusura del browser stesso.

In questo modo si potrà tenere traccia di eventuali precedenti scelte fatte dall’utente come, ad esempio, i prodotti scelti in un carrello oppure l’essersi loggato in un’area riservata.

In questo articolo cercheremo di fornire una panoramica completa sulle sessioni, iniziando dalle basi fino ad arrivare a configurazioni più complesse che riguardano database e altro.

Come funzionano le sessioni PHP

Quando un client si connette al server per la prima volta, il motore delle sessioni del PHP genera un ID univoco e crea un file nel quale verranno salvate le “variabili di sessione” e che ha per nome quello stesso ID.  Insieme alla risposta al client viene inviato un “cookie di sessione” che ha per valore quell’ID.

In questo modo, ogni volta che un client presenterà una richiesta con quel cookie, il PHP saprà in quale file sono contenute la variabili relative a quella sessione ripristinandole.

Personalizzare le sessioni PHP

L’uso delle sessioni in PHP oltre ad essere facile dal punto di vista del linguaggio è anche estremamente flessibile dal punto di vista delle scelte sul loro modo di funzionare. È possibile personalizzare sia le metodologie che strategie di gestione delle sessioni in moda da poterle memorizzare su DB, filesharing, APC e simili o memcache a seconda delle esigenze come vedremo.

Se non si vuole usare il cookie di sessione, è possibile far sì che il PHP aggiunga automaticamente l’id della sessione a tutti i link e ai form (sotto forma di campo nascosto) del nostro sito recuperandoli poi dal $_GET e $_POST sempre automaticamente. Questa è un’opzione è un retaggio delle vecchie versioni del PHP e fortemente sconsigliata dal punto di vista della sicurezza, come vedremo.

Le impostazioni delle sessioni

Prima di entrare nel dettaglio dell’uso delle sessioni, vediamo quali sono le principali impostazioni che ne modificano il comportamento.

Sono tutte modificabili agendo nella sezione [Session] del file di configurazione php.ini o da programma usando il comando ini_set(), oltre ad eventuali comandi specifici che vedremo successivamente.

ImpostazioneValore di defaultDescrizione
session.use_cookies1Se impostato a 0, il cookie di sessione non viene trasmesso. In presenza di ID di sessione trasmessi sia via cookie sia via GET/POST, il PHP dà la precedenza a quello trasmesso via cookie.
session.use_trans_sid0Se impostato a 1 e session.use_cookies = 0 allora l’ID della sessione verrà automaticamente aggiunto nelle pagine dei vostri siti alle URL di tutti i link e ai form.
url_rewriter.tagsUsato in abbinamento a session.use_trans_sid = 1 indica quali tag e relativo attributo contengono le URL a cui dovranno essere aggiunti gli estremi della sessione.
session.referer_check(stringa vuota)Può essere impostato per definire delle sottostringhe ammissibili nell’header “referer” per i client che si presentano con un ID di sessione. Può essere utile per escludere quelle richieste che arrivano presentando un cookie di sessione ma hanno un referer diverso dal nostro dominio (non sempre supportato nelle versioni di PHP precompilate per Windows).
session.use_only_cookies1Il valore di default va bene specie in presenza di session.use_cookies = 1. Se si trasmette un ID di sessione via GET/POST (ed in assenza di cookie di sessione) viene comunque lavorato come se fosse stato trasmesso via cookie; impostare questo parametro ad 1 riduce i rischi di intrusione nelle sessioni vincolando la trasmissione degli ID di sessione ai soli cookie.
session.cookie_lifetime0Indica la vita massima del cookie in secondi sul client. Se 0, appena il browser si chiude dovrebbe essere eliminato (il condizionale è d’obbligo visto che Explorer 8+ e Firefox non sempre li eliminano).
session.cookie_path/ (root)Path del cookie di sessione.
session.cookie_httponly(disabilitato)È utile abilitarlo perché (ove consentito dai browser) impedisce a JavaScript di manipolare il cookie di sessione.
session.cookie_secure(disabilitato)Se abilitato il cookie di sessione viene creato solo su connessioni SSL.
session.auto_start(disattivato)Imposta l’avvio automatico delle sessioni per ogni script lanciato.
session.namePHPSESSIDÈ il nome del cookie/parametro a cui viene associato l’ID di sessione, sarebbe buona norma cambiarlo, anzi usarne uno diverso per ogni sito ospitato sul nostro server.
session.hash_function0Lasciato a 0, indica l’MD5 come algoritmo da usare per la codifica del session. Questo algoritmo produce una stringa alfanumerica di 28 caratteri. Se impostato a 1, impone al codifiva con l’algoritmo SHA1 che produce stringhe da 32 caratteri. Dal PHP 5.3 è possibile scegliere tra molti altri algoritmi resi disponibili dall’estensione HASH il cui elenco è restituito sotto forma di array dalla funzione hash_algols().
session.hash_bits_per_character4Può assumere tre valori ed indica I possibili caratteri da usare nella costrizione dell’ID di sessione:
4 = a-f
5 = 0-9, a-v
6 = 0-9, a-z, A-Z, "-", ","
session.gc_maxlifetime1440 (secondi) Il “Garbage Collector” (GC) è un’operazione di pulizia delle sessioni scadute che può venir lanciata all’apertura della sessione; questo parametro indica dopo quanti secondi dall’ultimo accesso le sessioni debbono essere considerate scadute.
session.gc_probability e session.gc_divisor1 e 100Su siti ad alta densità di sessioni la pulizia operata dal GC può essere laboriosa, per questo non viene eseguita sempre ma con probabilità pari a session.gc_probability / session.gc_divisor rapportata a 100. Di default il primo vale 1 ed il secondo 100, quindi il GC verrà avviato con probabilità 1% all’avvio di uno script. Impostandoli allo stesso valore la probabilità diventa 100% ed il GC verrà avviato ad ogni apertura di sessione.
session.save_path/tmpIndica il percorso da usare per il salvataggio dei dati di sessione. Va verificato sempre che i processi PHP abbiano i diritti di scrittura sul percorso indicato. Di default è /tmp ma è sempre bene cambiarla, nel caso di più server di cui si vogliano condividere le sessioni si può indicare qui una share di rete.
session.save_handlerfilesIndica la metodologia di salvataggio dei dati delle sessioni. Se lasciamo il valore di default (files) i dati delle sessioni saranno salvati in file su disco, ma, avendo a disposizione un servizio RAM condivisa del tipo memcache, può essere impostato a memcache, previo opportuna rettifica di session.save_path.

Per fare un esempio del salvataggio delle sessioni su memcache facciamo conto che essa giri sulla porta 11211 del server 192.222.222.222, basterà cambiare queste due righe:

session.save_handler = memcache
session.save_path= "tcp://192.222.222.222:11211"

Se vuoi aggiornamenti su Sessioni PHP: cosa sono, come si usano inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Sessioni PHP: cosa sono, come si usano

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy