Articoli Manifesto Tools Links Canali Libri Contatti ?
Linguaggi / PHP

Guida alle sessioni in PHP

Abstract
Questa guida spiega le sessioni in PHP con un occhio di riguardo verso la sicurezza.
L'articolo presenterà la realizzazione di una pagina di login utente, in modo da associare anche un aspetto pratico a quello più teorico.
Data di stesura: 14/10/2003
Data di pubblicazione: 10/11/2003
Ultima modifica: 04/04/2006
di Davide Coppola Discuti sul forum   Stampa

Premesse

Questa guida richiede una conoscenza base del PHP, non è suo compito spiegarvelo, ma semplicemente illustrare una sua utilissima funzionalità: le sessioni.
Pertanto se non conoscete questo linguaggio affidatevi alla documentazione online PHP [1] oppure a un buon manuale come la guida a PHP4 [2].

La sessione

Dunque, la sessione si può definire come l'arco di tempo in cui viene monitorata la connessione di un utente. Durante questo arco di tempo è possibile conservare informazioni sulla navigazione accessibili da ogni pagina collegata alla sessione.
Detto in parole povere, in genere, la sessione inizia quando l'utente accede al sito e finisce quando lo abbandona, chiudendo il browser.
Perché mai ci dovrebbe interessare sapere quando un utente entra e quando esce?
Beh ... vi basti pensare che dietro le procedure di login nei portali e nei forum, dietro i carrelli della spesa (virtuali sia chiaro!), dietro i contatori di visitatori online e dietro moltissime altre cose, 9 volte su 10 c'entrano le sessioni!
Quindi credo che tutti coloro che voglio creare qualcosa di minimamente dinamico debbano considerare la lettura di questa guida.

Volendo fare un po' di storia si può dire che le sessioni per PHP sono nate nel pacchetto PHPLIB, che inizialmente le implementava in quanto non facevano parte dello standard, successivamente, vista la loro importanza, sono state inserite in PHP.

Il nostro obiettivo

Personalmente penso che il modo migliore di insegnare qualcosa a qualcuno sia dare un obiettivo pratico e spiegare come arrivare al suo completamento, ovvero spiegare la pratica con la teoria e non come sul 90% dei libri, lasciare la teoria fine a se stessa.
Per tale motivo questa guida spiegherà le sessioni con la realizzazione di una pagina di login di un sito. Procedo ad elencare le caratteristiche da implementare:

  1. Effettuare il login (mi sembra il minimo!)
  2. Mantenere le informazioni dello stato nella navigazione (loggato o no)
  3. Effettuare il logout
  4. Gestire il caso in cui l'utente ha i cookie disabilitati
  5. Ricordare username e password per permettere il login automatico

Queste funzionalità verranno spiegate nel dettaglio man mano che si procederà con la guida.
A tutto ciò va aggiunta la necessità di curare in maniera particolare l'aspetto della sicurezza.

L'unica facilitazione che mi sono concesso nella creazione di questa guida è stata quella di limitare il login ad un solo utente, questo perché realizzare un login per più utenti avrebbe comportato un appesantimento di codice rendendolo poco utilizzabile dal punto di vista didattico.

Un po' di teoria

Ora vi starete chiedendo "dopo tutto il discorso sulla pratica, ora ci parli di teoria?", ebbene si...
Per lanciarsi nella pratica un minimo di teoria si deve possedere, altrimenti ci si perde (di piu`).
Comunque i concetti fondamentali che dovete possedere per iniziare sono davvero pochi: come iniziare una sessione e come registrare delle variabili in questa.

Per dare via a una sessione si utilizza la funzione

session_start()

Dal momento in cui verrà usata la sessione sarà attiva e potremo utilizzarla.

Per registrare variabili in essa basta inserirle nell'array associativo globale $_SESSION nel seguente modo:

$_SESSION['nome_var'] = "valore";

Da questo momento in poi l'array $_SESSION conterrà il valore "valore" associato all'indice "nome_var", il che può essere visto come l'aver salvato, all'interno della sessione, la variabile "nome_var" a cui è associato il valore "valore".

A ciò va aggiunto il fatto che le sessioni sono associate ad un identificativo univoco, che viene generato quando si da inizio alla sessione e che solitamente viene conservato in un cookie nella variabile PHPSESSID. Quando i cookie sono disabilitati dobbiamo provvedere noi stessi al mantenimento di questo valore, a meno che in PHP non è attivata l'opzione --enable-trans-sid che lascia a PHP il compito di inserire nei nostri link relativi l'id di sessione. L'assenza dell'id di sessione fa credere a session_start() che si stia iniziando una sessione nuova, e quindi non ci permetterebbe di recuperare i valori salvati e continuare la nostra sessione.

Oltre la teoria sulle sessioni è importante tenere a mente che i valori passati tramite richieste HTTP di tipo GET saranno presenti nell'array associativo globale $_GET, quelli tramite POST saranno presenti in $_POST e quelli tramite cookie in $_COOKIE.
Il discorso sugli array globali verrà ripreso nel paragrafo sulla sicurezza.

Inizia il lavoro

Come promesso subito ci immergeremo nella pratica, di seguito è riportato il codice sorgente della pagina di login, dateci uno sguardo e cercate di iniziare a comprenderlo, i numerosi commenti dovrebbero aiutarvi nel compito.

  1. <?php 
  2. //dati per il login 
  3. $login_user="m3xican"; 
  4. $pass_user="189bbbb00c5f1fb7fba9ad9285f193d1"; //passwd="prova" 
  5. $redirect="http://localhost/~m3xican/m3xican/su.php"; 
  6.  
  7. //gestione della sessione nel caso in cui i cookie sono disabilitati 
  8. if(IsSet($_POST['PHPSESSID']) && !IsSet($_COOKIE['PHPSESSID'])) 
  9.   $PHPSESSID=$_POST['PHPSESSID']; 
  10.   header("Location: $redirect?PHPSESSID=$PHPSESSID"); //si ricarica la pagina di login 
  11.  
  12. session_start(); //si inizia o continua la sessione 
  13.  
  14. //controllo user e passwd da login 
  15. if(IsSet($_POST['posted_username']) && IsSet($_POST['posted_password'])) 
  16.   if($login_user==($_POST['posted_username']) && $pass_user==md5($_POST['posted_password'])) 
  17.     $_SESSION['user']=$_POST['posted_username']; 
  18.  
  19. //creazione cookie per login automatico 
  20. if(IsSet($_POST['ricorda']) && IsSet($_SESSION['user'])) 
  21.   $cok=md5($login_user)."%%".$pass_user; 
  22.   setcookie("sav_user",$cok,time()+31536000); 
  23.  
  24. //logout 
  25. if($_GET['logout']==1) 
  26.   $_SESSION=array(); // Desetta tutte le variabili di sessione. 
  27.   session_destroy(); //DISTRUGGE la sessione. 
  28.   if(IsSet($_COOKIE['sav_user'])) //se presente si distrugge il cookie di login automatico 
  29.     setcookie("sav_user",$cok,time()-31536000); 
  30.   header("Location: $redirect"); //si ricarica la pagina di login 
  31.   exit; //si termina lo script in modo da ritornare alla schermata di login 
  32.  
  33. //controllo user e passwd da cookie 
  34. if(IsSet($_COOKIE['sav_user'])) 
  35.   $info_cok=$_COOKIE['sav_user']; 
  36.   $cok_user=strtok($info_cok,"%%"); 
  37.   $cok_pass=strtok("%%"); 
  38.   setcookie("sav_user",$info_cok,time()+31536000); 
  39.  
  40.   if($cok_user==md5($login_user) && $cok_pass==$pass_user) 
  41.     $_SESSION['user']=$login_user; 
  42.  
  43. //caso in cui si vuole ricordare il login, ma i cookie sono off 
  44. if(!IsSet($_COOKIE['PHPSESSID']) && IsSet($_POST['ricorda'])) 
  45.   header("Location: $redirect?nocookie=1"); 
  46. ?> 
  47. <HTML> 
  48. <HEAD> 
  49. </HEAD> 
  50. <BODY> 
  51. <?php 
  52.  
  53. $PHPSESSID=session_id(); 
  54.  
  55. if(!IsSet($_SESSION['user'])) //non siamo loggati, pagina di login 
  56.   if($_GET['nocookie']==1) //i cookie sono off e si vuole ricordare il login 
  57.     print("Spiacente, ma con i cookie disabilitati non posso fare i miracoli ;)<BR> 
  58. Attivali se vuoi ricordare il tuo login.<BR>"); 
  59.   print("<BR><BR> <FORM METHOD=POST ACTION=\"login.php\"> 
  60. username: 
  61. <INPUT TYPE=TEXT SIZE=20 NAME=posted_username><BR> 
  62. password: 
  63. <INPUT TYPE=PASSWORD SIZE=20 NAME=posted_password><BR> 
  64. ricordami: <INPUT TYPE=CHECKBOX NAME=ricorda VALUE=1><BR><BR> 
  65. <INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Loggami\"><BR>"); 
  66.  
  67.   if(!IsSet($_COOKIE['PHPSESSID'])) //i cookie sono off, dobbiamo propagare noi il PHPSESSID 
  68.     print("<INPUT TYPE=HIDDEN NAME=PHPSESSID VALUE=$PHPSESSID>"); 
  69.   print("</FORM>"); 
  70. else //siamo loggati pagina riservata 
  71.   $username=$_SESSION['user']; 
  72.   print("Il tuo ID ?: $PHPSESSID <BR><BR>"); 
  73.   print("Sei loggato come: $login_user<BR><BR>"); 
  74.   print("<A HREF=\"login.php?logout=1\">logout</A>"); 
  75. ?> 
  76. </BODY> 
  77. </HTML> 

Spero che non vi siate sentiti troppo persi nel codice, dopotutto lo smarrimento è d'obbligo quando si vede un codice per la prima volta, pertanto andremo per gradi ad analizzarlo.

  1. //dati per il login 
  2. $login_user="m3xican"; 
  3. $pass_user="189bbbb00c5f1fb7fba9ad9285f193d1"; //passwd="prova" 
  4. $redirect="http://localhost/~m3xican/m3xican/sess/login.php"; 

Le prime 5 righe di codice contengono le informazioni necessarie per la verifica e la gestione del login.
Alla riga 3 vi è lo username dell'utente che può loggarsi, e alla riga 4 la password crittata in md5, questo perché ritengo che una password in chiaro non debba mai essere presente in nessun documento, così anche se qualcuno se ne appropriasse potrà solo tentare di decodificarla, ma non avrà accesso immediato alle nostre informazioni riservate.
Alla riga 5 è presente l'indirizzo assoluto della pagina di login, il cui utilizzo ci sarà chiaro a breve.
Logicamente l'indirizzo è impostato per la mia pagina, quindi per poter utilizzare altrove la pagina dovrete modificarlo secondo le vostre esigenze.

  1. session_start(); //si inizia o continua la sessione 

La riga 14 dà inizio alla sessione, da questo momento in poi potremo registrare ed utilizzare variabili in essa.
Una cosa importante da tenere a mente è che questa funzione, deve necessariamente essere inserita prima di qualsiasi tag html, questo in quanto le sessioni vanno ad operare sugli header delle pagine, e siccome gli header vengono chiusi quando si incontra il primo tag html, provare ad utilizzare una funzione di questo genere dopo un tag comporta un sicuro fallimento.

  1. if(!IsSet($_SESSION['user'])) //non siamo loggati, pagina di login 
  2.   if($_GET['nocookie']==1) //i cookie sono off e si vuole ricordare il login 
  3.     print("Spiacente, ma con i cookie disabilitati non posso fare i miracoli ;)<BR> 
  4. Attivali se vuoi ricordare il tuo login.<BR>"); 
  5.   print("<BR><BR> <FORM METHOD=POST ACTION=\"login.php\"> 
  6. username: 
  7. <INPUT TYPE=TEXT SIZE=20 NAME=posted_username><BR> 
  8. password: 
  9. <INPUT TYPE=PASSWORD SIZE=20 NAME=posted_password><BR> 
  10. ricordami: <INPUT TYPE=CHECKBOX NAME=ricorda VALUE=1><BR><BR> 
  11. <INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Loggami\"><BR>"); 
  12.  
  13.   if(!IsSet($_COOKIE['PHPSESSID'])) //i cookie sono off, dobbiamo propagare noi il PHPSESSID 
  14.     print("<INPUT TYPE=HIDDEN NAME=PHPSESSID VALUE=$PHPSESSID>"); 
  15.   print("</FORM>"); 

La condizione che distingue l'utente correttamente loggato da quello non riconosciuto è la presenza o meno del valore associato all'indice 'user' all'interno di $_SESSION. La verifica è facile, quando questo valore è impostato allora siamo loggati e possiamo accedere alla pagina riservata, altrimenti ci viene presentato il form generato dalle righe 70-80 per l'inserimento di username e password (71-74).
Alla riga 75 invece viene settata la variabile "ricorda" per attivare il login automatico, che verrà descritto meglio più avanti.
Alle righe 78-79 possiamo notare il primo accorgimento che ci permette di propagare l'identificativo di sessione attraverso le pagine che vogliamo visitare, in pratica, se non è presente il cookie contenente PHPSESSID, si passa tramite valore nascosto l'id della sessione contenuto in $PHPSESSID.

Il valore di $PHPSESSID viene recuperato alla riga 63:

  1. $PHPSESSID=session_id(); 

Grazie all'istruzione session_id() che recupera l'identificativo della sessione corrente.

Come abbiamo visto alla riga 65 viene effettuato il test che verifica se siamo loggati o no, quando siamo loggati viene eseguito il codice delle righe 83-88:

  1.   $username=$_SESSION['user']; 
  2.   print("Il tuo ID ?: $PHPSESSID <BR><BR>"); 
  3.   print("Sei loggato come: $login_user<BR><BR>"); 
  4.   print("<A HREF=\"login.php?logout=1\">logout</A>"); 

In questo caso viene semplicemente stampato l'identificativo di sessione e lo username della persona loggata.
Da notare alla riga 84 il fatto che andiamo ad assegnare alla variabile $username il valore di $_SESSION['user'], ciò avviene perché il valore contenuto nell'array $_SESSION non può essere utilizzato direttamente all'interno di una stringa (un'altra soluzione possibile era utilizzare la concatenazione con la stringa che lo precedeva e quella che lo seguiva), ma ciò non toglie che su di esso possiamo eseguire test come alla riga 65.
Altro dettaglio da notare è l'utilizzo della variabile logout nella riga 87 per segnalare alla pagina l'intenzione di sloggarsi. Tale variabile viene passata con il metodo GET. Vedremo più avanti il suo trattamento.

Ora che abbiamo visto come i dati vengono accettati dalla pagina (tramite il form) possiamo passare a vedere come essi vengono gestiti, il che è la parte più importante della guida.
Ricordatevi che, come detto prima, tutta la gestione delle sessioni deve avvenire prima di un qualsiasi tag html.

  1. //gestione della sessione nel caso in cui i cookie sono disabilitati 
  2. if(IsSet($_POST['PHPSESSID']) && !IsSet($_COOKIE['PHPSESSID'])) 
  3.   $PHPSESSID=$_POST['PHPSESSID']; 
  4.   header("Location: $redirect?PHPSESSID=$PHPSESSID"); //si ricarica la pagina di login 

Prima di tutto si verifica se è necessario gestire la trasmissione dell'id di sessione in quanto i cookie sono disabilitati. Ciò avviene grazie al test alla riga 8 che verifica se è stata passata la variabile $PHPSESSID tramite POST e se non è impostato nessun cookie contenente il PHPSESSID, se ciò è vero, i cookie sono disabilitati, quindi dobbiamo gestirci noi il tutto.
Per fare ciò assegniamo il valore associato a 'PHPSESSID' nell'array $_POST alla variabile $PHPSESSID, poi utilizziamo la funzione header alla riga 11 per ricaricare la pagina.
La funzione header va a scrivere negli header della transazione HTTP per trasferire il documento, utilizzata con la stringa:

header("Location: $redirect?PHPSESSID=$PHPSESSID");

Permette di trasferirci alla pagina indicata da $redirect (vedi riga 5) passando tramite GET il valore di $PHPSESSID.
Questo passaggio ci permetterà di continuare la nostra sessione, in quanto session_start() va a cercare negli array globali il valore di $PHPSESSID, trovandolo in $_GET saprà che deve continuare una sessione, diversamente ne inizierà una nuova.

  1. //controllo user e passwd da login 
  2. if(IsSet($_POST['posted_username']) && IsSet($_POST['posted_password'])) 
  3.   if($login_user==($_POST['posted_username']) && $pass_user==md5($_POST['posted_password'])) 
  4.     $_SESSION['user']=$_POST['posted_username']; 

Superata la prima difficoltà possiamo passare ad analizzare la verifica dei dati inseriti per il login.
Tale verifica avviene se solo nel caso in cui siano stati inseriti entrambi i campi (username e password) nel form (eventuali controlli a priori sull'inserimento dei dati di entrambi i campi possono essere effettuati tramite javascript) come si può vedere alla riga 21.
Alla riga 23 vi è il controllo sui valori inseriti, lo username inviato deve corrispondere a quello impostato alla riga 3 e il valore crittato tramite md5 della password spedita deve corrispondere a quello impostato alla riga 4.
Se il controllo va a buon fine, viene associato, nell'array $_SESSION, all'indice 'user' il valore di $_POST['posted_username'], ovvero lo username inviato. In questo modo ci sarà possibile accedere all'area riservata superando il test alla riga 69.

  1. //creazione cookie per login automatico 
  2. if(IsSet($_POST['ricorda']) && IsSet($_SESSION['user'])) 
  3.   $cok=md5($login_user)."%%".$pass_user; 
  4.   setcookie("sav_user",$cok,time()+31536000); 

In queste righe viene gestita la creazione del cookie per il login automatico, ciò avviene se l'utente ha espresso la volontà di effettuare il login automatico al prossimo accesso (ovvero se "ricorda" è settato in $_POST), e se l'utente è riuscito a loggarsi correttamente (ovvero 'user' è settato in $_SESSION).
Nel cookie verranno inseriti lo username crittato tramite md5 e la password crittata sempre in md5, perché logicamente non si possono lasciare informazioni del genere in chiaro.
I due valori saranno concatenati usando la stringa "%%" per separarli, così da rendere più comodo individuarli successivamente.
Da notare che il tempo di validità del cookie viene impostato a partire dal tempo corrente incrementato di 31536000 secondi, ovvero un anno esatto. Questo per fa si che il login venga conservato anche per lunghi periodi di inutilizzo.
Va ricordato che anche l'istruzione setcookie deve essere utilizzata prima di ogni tag html, in quanto i cookie vengono specificati negli header HTTP.

  1. //controllo user e passwd da cookie 
  2. if(IsSet($_COOKIE['sav_user'])) 
  3.   $info_cok=$_COOKIE['sav_user']; 
  4.   $cok_user=strtok($info_cok,"%%"); 
  5.   $cok_pass=strtok("%%"); 
  6.   setcookie("sav_user",$info_cok,time()+31536000); 
  7.  
  8.   if($cok_user==md5($login_user) && $cok_pass==$pass_user) 
  9.     $_SESSION['user']=$login_user; 

Queste righe gestiscono il recupero dei dati dal cookie utilizzato per il login automatico e la verifica della correttezza di questi dati.
Le righe 48-50 si occupano di separare i due valori di login e password (crittati) utilizzando la funzione strtok e specificando come delimitatore la stringa "%%".
Una volta recuperati i dati, si passa ad aggiornare il tempo di validità del cookie (riga 51), successivamente (riga 53) avviene il confronto con i valori impostati alle righe 3-4 allo stesso modo in cui si era visto alla riga 24, con l'unica differenza che qui anche il valore corretto dell'utente deve essere crittato tramite md5.
Se il confronto andrà a buon fine verrà settato il solito valore associato ad 'user' in $_SESSION in modo da consentire il corretto accesso all'area riservata.

  1. //caso in cui si vuole ricordare il login, ma i cookie sono off 
  2. if(!IsSet($_COOKIE['PHPSESSID']) && IsSet($_POST['ricorda'])) 
  3.   header("Location: $redirect?nocookie=1"); 

queste righe gestiscono la situazione in cui i cookie sono disabilitati e l'utente vuole effettuare il login automatico. Purtroppo PHP non permette i miracoli, pertanto bisogna avvisare l'utente della situazione.
Per fare ciò passiamo una variabile ($nocookie in questo caso) tramite il metodo GET alla pagina, la presenza di tale variabile sarà gestita dalle righe 67-69 che provvederanno ad avvisare l'utente della situazione.

  1. //logout 
  2. if($_GET['logout']==1) 
  3.   $_SESSION=array(); // Desetta tutte le variabili di sessione. 
  4.   session_destroy(); //DISTRUGGE la sessione. 
  5.   if(IsSet($_COOKIE['sav_user'])) //se presente si distrugge il cookie di login automatico 
  6.     setcookie("sav_user",$cok,time()-31536000); 
  7.   header("Location: $redirect"); //si ricarica la pagina di login 
  8.   exit; //si termina lo script in modo da ritornare alla schermata di login 

dalla riga 31 alla riga 39 viene gestita l'azione di abbandono della sessione da parte dell'utente.
Alla riga 33 viene cancellato il contenuto dell'array globale $_SESSION mediante funzione array() priva di parametri.
Poi, alla riga 34 viene distrutta la sessione mediante la funzione:

session_destroy()

Tale funzione si occupa di eliminare fisicamente una sessione, in modo da poterne creare una nuova in seguito.
Alle righe 35 e 36 si rileva l'eventuale presenza del cookie di login automatico e si provvede a una sua eventuale eliminazione.
Per eliminare un cookie è necessario inserire i medesimi parametri utilizzati per crearlo, ad eccezzione del tempo di espirazione, per il quale basta trasformare il segno '+' utilizzato alla creazione in un segno '-'.
Fatto ciò si ricarica la pagina di login (che presenterà nuovamente il form di inserimento dati) con l'istruzione header alla riga 38 e si esce dall'esecuzione dello script, con l'istruzione exit.
Tutti gli obiettivi sono stati raggiunti, vi consiglio di leggervi il tutto un paio di volte e di darvi alle vostre sperimentazioni per attuare la pratica e fissare meglio i concetti.

Osservazioni

La prima osservazione che mi viene in mente rileggendo il mio codice è il fatto che si potrebbe implementare una funzione che restituisce TRUE quando si verifica l'identificazione dell'utente e FALSE altrimenti. Sinceramente non l'ho realizzata perché per una sola pagina mi sembrava inutile (in pratica si dovrebbe andare ad inserire un if).
Ciò non toglie che in progetti di più ampio raggio (in cui l'identificazione della sessione può interessare molte pagine), è molto più pulito utilizzarla.

Una seconda osservazione è che l'array di sessione può essere utilizzato per contenere altre informazioni sull'utente loggato, e non deve essere utilizzato esclusivamente per mantenere lo stato dell'utente (loggato o no).
Logicamente le informazioni possono variare a seconda di quello che si desidera implementare, si può passare dal carrello della spesa in cui si vuole registrare gli articoli e le quantità acquistate da un utente, ad un servizio che conta gli utenti online in cui si può registrare l'id di sessione e l'ip dell'utente.
Come già detto, tutto dipende da quello che si deve realizzare, pertanto l'esempio di implementazione realizzato in questa guida è solo un punto di partenza per un'infinità di cose che si possono realizzare, dipende tutto dalla vostra fantasia e dalle vostre capacità!

Login & sicurezza

Non potevo non dedicare un paragrafo alla sicurezza in questa guida, in quanto l'argomento è di vitale importanza soprattutto quando le sessioni vengono utilizzate per determinati scopi (commerciali ad esempio).

Una pratica assolutamente sbagliata nella gestione delle sessioni è quella di utilizzare funzioni come session_register(), session_unregister() e session_is_registered().
Tali funzioni vanno ad operare sulle variabili di sessione inserite in un'ambiente globale, e ciò è molto pericoloso in quanto tale utilizzo può essere sfruttato da un aggressore per guadagnare diritti di accesso in maniera illecita, vediamo come.

L'utilizzo di quelle funzioni può portare a scrivere codice del genere:

<?php
session_start();
session_register("ok");

....

if(autenticazione_user())
  $ok=1;
else
  $ok=0;
?>
<?php
global $ok;

....

if($ok)
{
  ....
  // sezione privata
  ....
}
?>

questo codice basa l'autenticazione sulla variabile $ok, provate ad immaginare cosa può succedere se l'aggressore richiama da browser file2.php nel seguente modo:

http://www.sito.it/file2.php?ok=1

Inevitabilmente l'autenticazione sarebbe compromessa.
Purtroppo quando si parla di sicurezza non si può sperare che le cose vadano per il verso giusto, sperando magari che nessuno riesca mai ad indovinare (o a conoscere) il nome della variabile utilizzata per ricordare lo stato di connessione dell'utente.
Infatti è abitudine di tutti i programmatori associare sempre ai nomi di variabili un significato, in modo da rendere il codice leggibile e facilmente modificabile, pertanto, una variabile del genere avrò nomi tipo:
logged_in, logged, loggato, ok, ammesso, entrato e così via...
Ciò sta a significare che il rischio c'è sempre e che non può essere tralasciato.

Per risolverlo basta utilizzare lo stile illustrato nell'esempio descritto in questa guida, ovvero non utilizzare le funzioni session_register(), session_unregister() e session_is_registered(), ma andare ad inserire i valori nell'array globale $_SESSION e utilizzare anche per gli altri metodi di passaggio informazione i vari array globali illustrati. Questo perché $ok è diverso da $_SESSION['ok'].

A ciò si può aggiungere la possibilità di disabilitare l'ambiente globale delle variabili andando a modificare la variabile register_globals contenuta nel file di configurazione del PHP (php.ini) assegnandole il valore Off come riportato di seguito:

register_globals = Off

Questo può essere fatto soltanto dal gestore del server web, pertanto se siete clienti di un servizio di hosting potete verificare il settaggio della variabile utilizzando una pagina php con il seguente codice:

<?php
phpinfo();
?>

Attualmente tale variabile è settata ad on sulla maggior parte dei server, questo perché molti script PHP passati utilizzano l'ambiente globale.
La retrocompatibilità però non ci deve portare a commettere gli errori del passato, pertanto ogni nuovo script deve essere scritto pensando alla sicurezza, e quindi utilizzando gli array globali ($_SESSION, $_GET, $_POST e $_COOKIE).
Nel caso si voglia utilizzare il codice di qualcun altro, consiglio sempre di verificare la modalità del trattamento dei dati delle sessioni.

Informazioni sull'autore

Davide Coppola, studente di informatica alla Federico II di Napoli, appassionato di programmazione, sicurezza e linux. Fondatore e sviluppatore di dev-labs e di Mars Land of No Mercy. Per maggiori informazioni e contatti potete visitare la sua home page.

È possibile consultare l'elenco degli articoli scritti da Davide Coppola.

Altri articoli sul tema Linguaggi / PHP.

Risorse

  1. Docmentazione online di PHP.
    http://www.php.net/manual/it/
  2. Buon manuale sulla programmazione in PHP4.
    http://www.informatica.mcgraw-hill.it/catLibro.asp?item_id=572
Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.