Užklausų problemos PDO PHP

Kaip jau turėtumėte žinoti, SQL užklausos yra pažeidžiamos SQL injekcijų. PDO plėtinys sukurtas kovoti su injekcijomis, tačiau pats savaime, pagal numatytuosius nustatymus, jis to nedaro.

Pažvelkime į problemą pavyzdžiu. Tarkime, kad turime tokią užklausą, į kurią įterpiamas kintamasis:

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

Tarkime, kad mūsų kintamasis ateina iš kažkur išorės, pavyzdžiui, iš GET parametro. Kad būtų paprasčiau, tiesiog nustatykime jo reikšmę rankiniu būdu. Mes tikimės skaitinės reikšmės, pavyzdžiui, tokios:

php<?php
  $id = 1;
?>

Tačiau piktavalius įsilaužėlis gali perduoti tokią reikšmę (tarkime, kad mes turime lauką role):

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

Pasirodo, mes norėjome šios užklausos:

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

O gavome tokią, kuri ištraukia svetainės administratorių:

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

Kad išvengtume tokios situacijos, PDO turi specialų mechanizmą, kuris vadinamas paruoštos užklausos. Jas nagrinėsime kitoje pamokoje.

Задание 1

Sąmoningai atlikite SQL injekciją į savo duomenų bazę.