Roma – Alcune novità introdotte nelle ultime release di PHP sono destinate a cambiare il modo di programmare in tale linguaggio, in particolare per quanto riguarda la gestione delle variabili comunemente definite “esterne”. Le variabili esterne sono le variabili d’ambiente, le variabili relative al server web, le variabili registrate nelle sessioni, le variabili provenienti da richieste HTTP (GET o POST), i cookies.
Fino ad oggi l’accesso alle variabili esterne era sempre avvenuto in modo molto semplice: la configurazione predefinita dell’interprete PHP, infatti, prevedeva che esso le rendesse disponibili automaticamente sotto forma di variabili globali.
Questo comportamento, a partire dal recente rilascio della versione 4.2.0 del linguaggio, viene considerato deprecato ed è quindi destinato a diventare l’eccezione e non più la regola.
Da un punto di vista pratico questa piccola svolta consiste nel modificare da On ad Off il valore di default della direttiva di configurazione register_globals (nel file php.ini). Nulla di irreparabile, quindi; esiste, al contrario, un modo banale per ripristinare la situazione precedente, e cioè modificare il file php.ini e reimpostare la direttiva register_globals ad Off.
I prodromi di questo cambiamento si erano ravvisati già con l’introduzione, nella precedente release 4.1.0, di alcuni nuovi array associativi ($_GET, $_POST, $_SERVER, etc.) in luogo di altri ($HTTP_GET_VARS, $HTTP_POST_VARS, $SERVER_VARS, etc.), dichiarati contestualmente deprecati.
Le ragioni del cambiamento vanno ricercate nel tentativo di obbligare gli sviluppatori ad uno stile di programmazione meno esposto a rischi di sicurezza. In molte situazioni, infatti, la registrazione automatica delle variabili esterne come variabili globali può aprire delle falle di sicurezza negli script PHP. Tipicamente, un utente malizioso potrebbe tentare di alternare il comportamento di uno script fornendo un input ad hoc. Vediamo quali sono i nuovi array, ricordando che essi sono disponibili in ogni contesto (per questo motivo sono stati ribattezzati “superglobals”).
Gli array $_GET e $_POST contengono, rispettivamente, le variabili provenienti da richieste HTTP con metodo GET e POST e vanno a sostituirsi ai ben noti array $HTTP_GET_VARS e $HTTP_POST_VARS; questi ultimi, come si è anticipato, continueranno ad esistere per motivi di compatibilità all’indietro ma saranno considerati deprecati.
L’array $HTTP_POST_FILES, contenente informazioni sui file trasmessi al server mediante operazioni di upload, viene analogamente sostituito da $_FILES.
L’array $_REQUEST costituisce una novità, non avendo un equivalente nelle versioni di PHP precedenti alla 4.2.0. Questo array contiene qualsiasi input sia stato fornito dall’utente con qualsiasi metodo e viene costruito dalla confluenza delle variabili GET, POST e dai cookies.
Per quanto riguarda cookies e sessioni, in luogo dei familiari array $HTTP_COOKIE_VARS ed $HTTP_SESSION_VARS vengono introdotti i nuovi $_COOKIE e $_SESSION, di ovvio significato.
Infine, le variabili relative al server web e le variabili d’ambiente vengono inserite negli array associati $_SERVER e $_ENV, mutuando i precedenti $HTTP_SERVER_VARS ed $HTTP_ENV_VARS Le implicazioni di questo cambio di rotta sul funzionamento degli script PHP preesistenti possono essere notevoli. Se lo stile di programmazione adottato in precedenza non risulta compatibile con le nuove impostazioni è ragionevole prevedere, a seguito dell’aggiornamento alla versione 4.2.0, la comparsa di numerosi malfuzionamenti.
È probabile, in particolare, che si verifichino effetti a catena dovuti all’improvviso perdita di significato delle variabili utilizzate. Un esempio tipico è quello delle variabili provenienti da richieste HTTP di tipo GET, tradizionalmente accedute come variabili globali, che con le nuove impostazioni risulteranno nulle.
Vediamo un caso pratico. Supponiamo di aver realizzato uno script che estrae articoli da un database, utilizzando un identificativo fornito dall’utente. L’indirizzo URL per l’accesso all’articolo identificato dal numero 29 sarà qualcosa del genere:
http://host/read.php?ID=29
Nel codice PHP dello script read.php si dovrà ovviamente acquisire il valore del parametro ID in modo da poter interrogare il database.
Ecco, allora, che ci imbattiamo nel problema sopra citato: se l’accesso al valore di ID (come è probabile) avviene attraverso la variabile globale $ID, nel momento in cui venisse effettuato l’aggiornamento alla versione 4.2.0 di PHP, senza reimpostare su On la direttiva register_globals, lo script cesserebbe di funzionare. La variabile globale $ID, infatti, risulterebbe nulla, mentre il valore 29 sarebbe memorizzato in in $_GET[“ID”].
Alla luce di quanto detto, dovrebbe risultare evidente la necessità, se non addirittura l’urgenza, di iniziare a revisionare i propri script PHP, cercando un ragionevole compromesso tra compatibilità in avanti e all’indietro.
Luca Balzerani
Presidente di LatoServer.it
Sviluppo e Programmazione Server-Side