PHP Magic Quotes

Feltűnt, hogy valamiért a 'Legyen Ön is Milliomos!' játékomban, gyűlnek az olyan kérdések, amelyekben az idézőjel és az aposztróf karakterek rendre eszképelve jelennek meg. Vagyis ' karakter helyett \' karakterek és " karakter helyett pedig \" karakterek lesznek. Eléggé furcsálltam a dolgot, aztán most utánanéztem, miért is lehet ez, majd eszembe jutott, hogy hát már ezer éve találkoztam egyszer ezzel a problémával.

Akkoriban még épp csak kezdtem ismerkedni a PHP-val saját szerveremen, amikor rábukkantam a PHP-nak erre a funkciójára: http://hu.php.net/manual/en/security.magicquotes.php Szépen átírtam a php.ini-ben a magic_quotes_gpc direktívát off-ra, majd téma lezárva. Egész mostanáig.

Ezúttal már utána is olvastam, hogy mire is találták ezt ki. Alapvetően azt a célt szolgálja, hogy a kezdő PHP programozóknak segítsen elkerülni az SQL Injection alapú támadásokat, azonban a PHP 5.3-tól kezdve már elavult megoldásnak számít és használata nem javasolt. Helyette a futás idejű, explicit eszképelés ajánlott. Ez a megoldás egyébként több tudatosságot igényel, viszont mivel nem alakít át minden bejövő adatot ész nélkül, ezért teljesítmény növekedést is eredményezhet.

A mostani problémám így ezek után pedig röviden abból fakad, hogy a jelenlegi tárhely szolgáltatónknál vélhetően egyszer csak valamilyen oknál fogva bekapcsolták ezt a funkciót.


1. megoldás: levelet írni nekik, hogy hát izé.
2. megoldás: kódom megfelelő helyére beilleszteni egy pár plusz sort, ami lekérdezi a funkció állapotát és bekapcsoltság esetén konvertál. Ehhez egyébként találtam is egy pont megfelelőnek tűnő kódot a http://php.net oldalon: http://hu.php.net/manual/en/security.magicquotes.disabling.php

if (get_magic_quotes_gpc())
{
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process))
    {
        foreach ($val as $k => $v)
        {
            unset($process[$key][$k]);
            if (is_array($v))
            {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            }
            else
            {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}


Több okból kifolyólag is a második megoldás tűnt célravezetőbbnek, így azt választottam.