Težave s poizvedbami v PDO v PHP

Kot že morate vedeti, so SQL poizvedbe občutljive na SQL-injekcije. Razširitev PDO je namenjena boju proti injekcijam, vendar tega ne naredi samodejno, privzeto.

Poglejmo si težavo na primeru. Recimo, da imamo naslednjo poizvedbo, v katero se vstavi spremenljivka:

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

Recimo, da naša spremenljivka prihaja od nekod od zunaj, na primer iz GET-parametra. Za enostavnost pa jo določimo ročno. Pričakujemo neko številsko vrednost, na primer takšno:

php<?php
  $id = 1;
?>

Zlonamerni heker pa lahko posreduje naslednjo vrednost (predpostavimo, da imamo polje role):

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

Izkazalo se je, da smo želeli naslednjo poizvedbo:

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

Prejeli pa smo naslednjo, ki izvleče administratorja spletnega mesta:

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

Da se izognemo takšni situaciji, je v PDU predviden poseben mehanizem, ki se imenuje pripravljene poizvedbe. Te bomo obravnavali v naslednji lekciji.

Задание 1

Namerno izvedite SQL-injekcijo v vašo bazo podatkov.