PHP prakticky/Vkládání parametrů

Vkládání uživatelských parametrů do SQL je citlivá věc. Ledabylý kód může fungovat dobře, ale za určitých okolností (např. uvozovka v řetězci) vyvolává nepříjemné chyby. Nedostatečně zabezpečené vkládání se pak může pro útočníka stát vítanou branou do systému (SQL injection).

Nejlepší cestou vkládání parametrů jsou prepared statements. Podporují je různé knihovny databázové abstrakce, od verze PHP5 pak hlavně PDO.

// pro jednoduché parametry stačí poziční parametr a hodnota předaná přímo v execute()
$stmt = $db->prepare("SELECT * FROM tabulka WHERE id=?");
$stmt->execute(array($id));

// pro parametr vkládaný v url se použije metoda bindParam(), která předává proměnnou odkazem
$stmt = $db->prepare("SELECT * FROM tabulka WHERE id=?");
$stmt->bindParam(1, $_GET['id']);
$stmt->execute();

// vkládání vícenásobných hodnot
$values = array(1, 2, 3, 5);
$s = $db->prepare('SELECT * FROM tabulka WHERE foo IN ('.implode(',', array_fill(0, count($values), '?')).')');
$s->execute($values);

Pokud nejsou prepared statements k dispozici, je třeba hodnoty správně ošetřit. Číselné hodnoty přetypovat, řetezcové hodnoty escapovat.

$query = sprintf("SELECT * FROM tabulka WHERE cislo=%d AND retezec=%s",
  '012 OR 1',
  "'".mysql_real_escape_string("' OR 1")."'"
);
echo $query; // vytiskne SELECT * FROM tabulka WHERE cislo=12 AND retezec='\' OR 1'