Problemi upita u PDO-u u PHP-u
Kao što već treba da znate, SQL upiti su podložni SQL-injekcijama. Proširenje PDO je osmišljeno da se bori protiv injekcija, ali prosto tako, podrazumevano, ono to ne čini.
Pogledajmo problem na primeru. Neka imamo sledeći upit, u koji se ubacuje promenljiva:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Neka naša promenljiva dolazi odnekud spolja, na primer, iz GET-parametra. Radi jednostavnosti, međutim, hajde samo da postavimo nenu vrednost ručno. Očekujemo neku numeričku vrednost, na primer, ovakvu:
<?php
$id = 1;
?>
Zlonamerni haker, međutim, može proslediti
sledeću vrednost (smatramo da imamo
polje role):
<?php
$id = '-1 OR role="admin"';
?>
Ispostavlja se da smo hteli sledeći upit:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
A dobili smo sledeći, koji izvlači administratora sajta:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Da bismo izbegli ovakvu situaciju, u PDO-u je predviđen poseban mehanizam, koji se zove pripremljeni upiti. Njih ćemo razmatrati u sledećoj lekciji.
Namerno izvršite SQL-injekciju na vašu bazu podataka.