Scrivere codice indipendente dal "Magic Quotes"

di Gianni Tomasicchio - 5 marzo 2005

cookie

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.

1 commento

1 Luca DI Matteo lucasweb mercoledž 15 settembre 2010, ore 07:31
Guida molto utile e valida. Volevo segnalare un piccolo errore descrittivo.
Nella seconda funzione, quella per togliere gli slashes, nella parte finale
c'è scritto
// Aggiungo gli slashes a tutti i dati GET/POST/COOKIE
In questa seconda dovrebbe essere //Tolgo gli slashes.....

Per il resto ottimo post.
Grazie
Effettua l'accesso o registrati per inserire un commento