Variabili globali e sicurezza dell’interprete PHP

Un uso scorretto delle variabili globali in una pagina PHP può portare gravi problemi di sicurezza. Per questo sui Server Yepa il parametro register_globals è rigorosamente impostato ad “off”.

L’interprete PHP è ormai giunto alla versione 5.0.3. Il lancio della versione 5 è stato caratterizzato da diverse novità e da polemiche nel mondo dei programmatori PHP per il fatto che ha molti problemi di compatibilità con i programmi scritti per le versioni precedenti. Uno dei cambiamenti più controversi nelle versioni passate di PHP fu l’impostazione ad “off” del parametro “register_globals” presente nel file di configurazione “php.ini” dalla versione 4.2. Molti programmatori scrivevano codice basandosi sul fatto che fosse impostato ad “on” senza sapere cosa questo volesse dire. Quando il parametro fu impostato ad “off” di default, buona parte del codice prodotto da programmatori imporovvisati smise di funzionare.

Il parametro “register_globals” indica se si vuole che le variabili di ambiente o quelle provenienti da una form siano considerate come variabili globali.

L’uso scorretto di tali variabili (se la direttiva fosse impostata ad “on”), potrebbe portare alla scrittura di codice insicuro. Sui Server Yepa, tale parametro è impostato rigorosamente ad “off”, per garantire sia la sicurezza delle macchine, che il corretto funzionamento delle applicazioni scritte dai webmaster.

Vediamo praticamente come sarebbe possibile “aggirare” un semplice script PHP (auth.php) facendo un uso scorretto delle variabili globali: il seguente script PHP dovrebbe inviare all’utente autenticato una pagina nascosta.

<?php

// Definisce "$authorized = true" solo se l'utente si e' autenticato
if (authenticated_user()) {
  $authorized = true;
}

if ($authorized) {
  include "/path/alla/pagina/privata/dati.php";
}
?>

Se il parametro “register_globals” fosse impostato ad “on”, sarebbe facilissimo corrompere la logica del nostro CGI. Infatti, non avendo inizializzato la variabile “$authorized” come “false”, si potrebbe eseguire dal nostro browser una richiesta del tipo “GET auth.php?authorized=1” aggirando così l’autenticazione!

Per un corretto uso del passaggio dei parametri dal Browser, rimandiamo il lettore all’uso delle variabili “Superglobali”: un ottima guida è consultabile direttamente dal sito ufficiale dell’interprete PHP (http://www.php.net) Naturalmente, l’impostazione ad “off” del parametro “register_globals”, non può garantirci che l’applicazione sia sicura: un buono sviluppatore PHP deve sempre fare molta attenzione all’inizializzazione delle variabili ed al controllo dei dati in ingresso allo script (“input validation”).