Lze vložit jakýkoli dotaz, ať už je čtení nebo zápis, trvalý nebo přechodný. Injekce lze provést ukončením jednoho dotazu a spuštěním samostatného (možné pomocí mysqli
), což činí zamýšlený dotaz irelevantním.
Jakýkoli vstup do dotazu z externího zdroje, ať už od uživatelů nebo dokonce interní, by měl být považován za argument dotazu a parametr v kontextu dotazu. Každý parametr v dotazu musí být parametrizován. To vede ke správně parametrizovanému dotazu, ze kterého můžete vytvořit připravený příkaz a spustit jej s argumenty. Například:
SELECT col1 FROM t1 WHERE col2 = ?
?
je zástupný symbol pro parametr. Pomocí mysqli
, můžete vytvořit připravený výpis pomocí prepare
, svázat proměnnou (argument) s parametrem pomocí bind_param
a spusťte dotaz pomocí execute
. Hádku nemusíte vůbec sanovat (ve skutečnosti je to na škodu). mysqli
dělá to pro vás. Celý proces by byl:
$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
Existuje také důležitý rozdíl mezi parametrizovaným dotazem a připravené prohlášení . Toto prohlášení, i když je připraveno, není parametrizováno, a je tedy náchylné na injekci:
$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
Abych to shrnul:
- Vše Dotazy by měly být správně parametrizovány (pokud nemají žádné parametry)
- Vše s argumenty dotazu by se mělo zacházet co nejvíce nepřátelsky bez ohledu na jejich zdroj