Problemen met query's in PDO in PHP
Zoals je al moet weten, zijn SQL-query's vatbaar voor SQL-injecties. De PDO-extensie is bedoeld om injecties te bestrijden, maar standaard, uit zichzelf, doet het dit niet.
Laten we het probleem bekijken aan de hand van een voorbeeld. Stel dat we de volgende query hebben, waarin een variabele wordt ingevoegd:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Stel dat onze variabele van buitenaf komt, bijvoorbeeld vanuit een GET-parameter. Voor de eenvoud, laten we de waarde echter gewoon handmatig instellen. We verwachten een numerieke waarde, zoals deze:
<?php
$id = 1;
?>
Een kwaadwillende hacker kan echter de
volgende waarde doorgeven (we gaan ervan uit dat we
een veld role hebben):
<?php
$id = '-1 OR role="admin"';
?>
Het resultaat is dat we de volgende query bedoelden:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Maar we kregen de volgende query, die de beheerder van de site ophaalt:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Om een dergelijke situatie te voorkomen, heeft PDO een speciaal mechanisme, dat prepared statements (voorbereide query's) wordt genoemd. Deze zullen we in de volgende les behandelen.
Pleeg opzettelijk een SQL-injectie op je database.