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<?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<?php
  $id = 1;
?>

Zlomyslný hacker však může předat následující hodnotu (předpokládejme, že máme pole role):

php<?php
  $id = '-1 OR role="admin"';
?>

Výsledkem je, že jsme chtěli následující dotaz:

php<?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<?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.

Задание 1

Záměrně proveďte SQL injekci do vaší databáze.