Päringute probleemid PDO-s PHP-s
Nagu te juba teate, on SQL-päringud altid SQL-injektsioonidele. PDO laiendus on loodud injektsioonide vastu võitlemiseks, kuid lihtsalt vaikimisi ei tee seda automaatselt.
Vaatame probleemi näite varal. Olgem, et meil on järgmine päring, kuhu sisestatakse muutuja:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Olgem, et meie muutuja tuleb kuskilt väljast, näiteks GET-parameetrist. Lihtsuse huvides aga määrame selle väärtuse käsitsi. Me ootame mingit numbrilist väärtust, näiteks sellist:
<?php
$id = 1;
?>
Õel häkker võib aga edastada
järgmise väärtuse (eeldame, et meil
on väli role):
<?php
$id = '-1 OR role="admin"';
?>
Selgub, et me tahtsime järgmist päringut:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Kuid saime järgmise, mis tõmbab välja veebisaidi administraatori:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Sellise olukorra vältimiseks on PDO-s ette nähtud spetsiaalne mehhanism, mida nimetatakse ettevalmistatud päringuteks. Neid analüüsime järgmises õppetükis.
Tehke tahtlikult SQL-injektsioon oma andmebaasi.