Problémy dotazů v PDO v PHP
Jak již pravděpodobně víte, SQL dotazy jsou náchylné k SQL injekcím. Rozšíření PDO je určeno k boji proti injekcím, ale jednoduše tak, ve výchozím nastavení, to nedělá.
Podívejme se na problém na příkladu. Předpokládejme, že máme následující dotaz, do kterého se vkládá proměnná:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Předpokládejme, že naše proměnná přichází odkudsi zvenčí, například z GET parametru. Pro jednoduchost ji však prostě nastavme ručně. Očekáváme nějakou číselnou hodnotu, například tuto:
<?php
$id = 1;
?>
Zlomyslný hacker však může předat
následující hodnotu (předpokládejme, že máme
pole role):
<?php
$id = '-1 OR role="admin"';
?>
Výsledkem je, že jsme chtěli následující dotaz:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
A dostali jsme následující, který vytáhne správce webu:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Abychom se vyhnuli této situaci, v PDO je připraven speciální mechanismus, který se nazývá připravené dotazy. Ty si rozebereme v příští lekci.
Záměrně proveďte SQL injekci do vaší databáze.