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
$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
$id = 1;
?>
Zlonamerni heker pa lahko posreduje
naslednjo vrednost (predpostavimo, da imamo
polje role):
<?php
$id = '-1 OR role="admin"';
?>
Izkazalo se je, da smo želeli naslednjo poizvedbo:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Prejeli pa smo naslednjo, ki izvleče administratorja spletnega mesta:
<?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.
Namerno izvedite SQL-injekcijo v vašo bazo podatkov.