Scrivere codice indipendente dal "Magic Quotes"

Uno dei problemi che affligge i programmatori PHP è quello di cercare di scrivere codice che funzioni su qualunque server venga fatto girare. La maggior parte degli hoster infatti non permette di modificare le impostazioni del php.ini e questo significa che i nostri script spesso si trovano a lavorare in un ambiente molto diverso da quello nel quale li abbiamo realizzati.

Un modo per minimizzare i possibili problemi che potrebbero crearsi è quello di inserire delle routine, all’inizio della nostra pagina PHP, che testino l’ambiente di lavoro (i valori impostati nel php.ini) e attuino eventuali contromisure per “standardizzarlo”

Il magic_quotes_gpc è una delle direttive del php.ini che più spesso crea problemi. Se impostata su “On” (valore di default) il PHP provvederà automaticamente ad aggiungere degli slashes a tutti i dati provenienti da GET, POST e COOKIE. Altrimenti questi dati rimarranno inalterati.

E' ovvio quindi che se vogliamo realizzare uno script che funzioni indipendentemente dal valore di questa direttiva dovremo preventivamente o togliere tutti gli slashes o aggiungerli ai dati GET, POST e COOKIE.

Il seguente codice ad esempio si occupa di aggiungere gli slashes nel caso in cui nel php.ini la direttiva magic_quotes_gpc sia impostata ad “Off”:

// se nel php.ini non è abilitato il "magic_quotes_gpc"
if (!get_magic_quotes_gpc())
{
   // funzione ricorsiva per l'aggiunta degli slashes ad un array
   function magicSlashes($element)
   {
       if (is_array($element))
           return array_map("magicSlashes", $element);
       else
           return addslashes($element);
   }

   // Aggiungo gli slashes a tutti i dati GET/POST/COOKIE
   if (isset ($_GET)     && count($_GET))    $_GET    = array_map("magicSlashes", $_GET);
   if (isset ($_POST)    && count($_POST))   $_POST   = array_map("magicSlashes", $_POST);
   if (isset ($_COOKIES) && count($_COOKIES))$_COOKIE = array_map("magicSlashes", $_COOKIE);
}

Se invece preferiamo lavorare senza gli slashes, indipendentemente dalle impostazioni del php.ini possiamo far precedere i nostri script dal seguente codice:

// se nel php.ini è abilitato il "magic_quotes_gpc"
if (get_magic_quotes_gpc())
{
   // funzione ricorsiva per l'eliminazione degli slashes ad un array
   function magicSlashes($element)
   {
       if (is_array($element))
           return array_map("magicSlashes", $element);
       else
           return stripslashes($element);
   }

   // Rimuovo gli slashes a tutti i dati GET/POST/COOKIE
   if (isset ($_GET)     && count($_GET))    $_GET    = array_map("magicSlashes", $_GET);
   if (isset ($_POST)    && count($_POST))   $_POST   = array_map("magicSlashes", $_POST);
   if (isset ($_COOKIES) && count($_COOKIES))$_COOKIE = array_map("magicSlashes", $_COOKIE);
}

Come avrete notato, l’algoritmo prevede la chiamata ricorsiva di una funzione per attraversare gli array, qualsiasi sia la loro profondità.

La funzione get_magic_quotes_gpc controlla il valore della direttiva magic_quotes_gpc nel php.ini, a seconda della sua impostazione gli array $_GET, $_POST e $_COOKIE, se esistono e contengono dati, vengono “mappati”, attraverso la funzione array_map, sulla nostra funzione magicSlashes che provvede, ricorsivamente, ad aggiungere (primo esempio) o a togliere (secondo esempio) gli slashes.