Register_globals è una direttiva di php.ini, ovvero un parametro di configurazione del core del modulo PHP stesso. Il suo valore è booleano (ON/OFF) e indica al modulo se registrare o meno le variabili di tipo GET, POST, Cookie, Server ed Environment come variabili globali.

Facciamo un esempio per capire meglio il suo funzionamento impostandola ad ON.
Ammettiamo di avere una pagina che riceva dei dati da un form e che a seconda dei dati ricevuti compia una certa azione, un include per esempio:
if ($password=='ciao')
{
    $accesso=1;
}

if ($accesso==1)
{
    include "paginaprivatissima.php";
}
else
{
    include "paginadilogin.php";
}

Con register_globals impostato su ON questo è un ottimo metodo per farsi bucare tutte le difese possibili che abbiamo implementato nel nostro script. Infatti un craker avrebbe vita facile se scrivessimo così i nostri codici (con o senza la direttiva abilitata effettivamente con questo tipo di script), il fatto di aver abilitato il parametro costituisce una più drastica vulnerabilità alle nostre pagine. Difatti gli basterà digitare sulla barra degli indirizzi:

www.domain.ext/pagina.php?accesso=1

per avere accesso libero alla nostra pagina privata dato che il parametro accesso verrà usato come variabile globale $accesso senza esser filtrata in alcun modo dal nostro script.
Il semplice impostare la direttiva su OFF pero' non risolve di molto il nostro problema di sicurezza con il codice di poc'anzi, lo migliora notevolmente, questo è certo.

Sempre mantenendo il register_globals ON, se il nostro script fosse così:

if ($_POST['password']=='ciao')
{
    $accesso=1;
}
else
{
    $accesso=0;
}

if ($accesso==1)
{
    include "paginaprivatissima.php";
}
else
{
    include "paginadilogin.php";
}

Avremo un livello di sicurezza decisamente migliore, come prima impostazione abbiamo deciso che il valore password dovrà pervenire tramite il metodo POST, rendendo inutili attacchi tramite metodi GET con il parametro password (simile all'esempio dell'url sopra menzionata) e poi abbiamo stabilito che se il parametro password non è settato o, comunque, non è uguale alla stringa desiderata il nostro parametro accesso assumerà un valore che non passerà il successivo controllo e quindi non visualizzerà quanto vogliamo rendere privato.

Non abbiamo ancora scongiurato però tutti i nostri problemi, anche settando il register_globals su OFF esistono possibilità di attacco, per esempio con il seguente script:

if ($_POST['password']=='ciao')
{
    $accesso=1;
}

if ($accesso==1)
{
    include "paginaprivatissima.php";
}
else
{
    include "paginadilogin.php";
}

Saremo di certo vulnerabili ad un attaco di brute force (fonte Wikipedia).

Le implementazioni a livello di sicurezza da fare non finiscono mai, certo è che il parametro register_globals impostato ON rappresenta un grave pericolo.

Al fine di scongiurarlo, anche per portabilità se vogliamo, è bene inizializzare ogni variabile che andremo ad utilizzare nelle nostre pagine:

$variabile=false;
// oppure
$variabile="";

Ed a questo aggiungere i controlli del caso, specialmente sulle variabili più sensibili.

Qualora la direttiva sia impostata su ON è possibile, se l'hosting lo permette, influenzare il suo valore tramite .htaccess (vedi articolo correlato).

Dalla versione 4.2.0 del modulo PHP questa direttiva è impostata OFF di default, nelle attuali versioni in uso è ritenuta Deprecata e dalla versione 6.0.0 invece è stata totalmente rimossa.

Articoli correlati

Guida_a_.htaccess

Thread correlati

Perché mantenere register_globals su OFF

Terminologia PHP-MySQL
Php GTa.jpg
Domande?
Accedi alla home della sezione Php e Mysql o alla Home del Forum GT

  • Questa pagina è stata modificata per l'ultima volta il 9 feb 2009 alle 23:02.
  • Questa pagina è stata letta 6 223 volte.