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

Zlonamerni haker, međutim, može proslediti sledeću vrednost (smatramo da imamo polje role):

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

Ispostavlja se da smo hteli sledeći upit:

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

A dobili smo sledeći, koji izvlači administratora sajta:

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

Задание 1

Namerno izvršite SQL-injekciju na vašu bazu podataka.