Alap, hogy ha PHP-ben SQL adatbázisba viszünk fel adatokat, akkor ha az egy űrlapról érkezik, esetleg url-ből, vagy bármi nem megbízható helyről, akkor mindenképp le kell védeni bizonyos káros karaktereket. Ezek jellemzően az idézőjelek. Ugyanis az SQL forráskódban is a karakterláncokat idézőjelek közé tesszük. Ha ellenőrzés nélkül bekerülhet egy aposztróf a szövegbe, akkor az lezárja a karakterláncot és utána sok csúnya dolgot lehet művelni, amibe nem megyek bele. Aki kíváncsi rá, írja be a google keresőbe, hogy sql injection. Na most ennek elkerülésére mysql-hez létezik a mysql_real_escape_string függvény. Nagyjából hasonló, mint az addslashes. Abban mindenesetre mindkettő közös, hogy az idézőjelek elé \ jelet tesz.
Van viszont egy php opció (magic_quotes_gpc), aminek bekapcsolásával automatikusan backslashelve lesznek. Akkor viszont ha pluszba ráeresztjük mi is a fenti függvényeket, mindez duplán történik meg. Aztán lekérdezéskor lehet eltávolítani a felesleges \ jeleket a stripslashes-el. Ezt elkerülendő, írtam egy függvényt, amivel még minden más művelet előtt rekurzívan ( mert hogy egy űrlap egy eleme is lehet tömb. ) törölhető vagy beállítható a backslashelés gyakorlatilag bármilyen tömbben. Persze nyilván a $_POST, $_GET és társaiban van rá inkább szükség. Akkor hasznos, ha a szerver beállításait nincs jogunk módosítani. A függvény a következő:
{
if (!is_array($string))
{
if ($bool)
{
if (!get_magic_quotes_gpc())
{
$string = addslashes($string);
}
}
else
{
if (get_magic_quotes_gpc())
{
$string = stripslashes($string);
}
}
return;
}
foreach ($string as $key => &$str)
{
setSlashes($str, $bool);
}
}
Használata:
Első paramétere maga a tömb. Például $_POST. Második paramétere pedig egy logikai érték (true, vagy false). Amennyiben true, úgy veszi, hogy szeretném, ha az adatok backslashelve lennének. Ekkor ha volt automatikus backslash, nem csinál semmit. Egyébként meghívja az addslashes függvényt. Ha false, akkor automatikus védelem esetén a strisplashes-t hívja meg, máskülönben békén hagyja a stringeket.
setSlashes($_POST, false);
Így ha 2. paraméter false, a mysql_real_escape_string teheti a dolgát az adatbázis műveleteknél. Viszont akkor nagyon kell figyelni rá, hogy el ne maradjon. Ha viszont true, akkor biztosan le lesznek védve az idézőjelek és \ jelek. Viszont mivel a mysql_real_escape_string többet is tesz, célszerűbb azt használni. Persze a függvényben is kicserélhető akár a mysql_real_escape_string-re az addslashes, ha mysql adatbázishoz kell a védelem.