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

Õel häkker võib aga edastada järgmise väärtuse (eeldame, et meil on väli role):

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

Selgub, et me tahtsime järgmist päringut:

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

Kuid saime järgmise, mis tõmbab välja veebisaidi administraatori:

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

Задание 1

Tehke tahtlikult SQL-injektsioon oma andmebaasi.