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.