Problémy dopytov v PDO v PHP

Ako už určite viete, SQL dopytom hrozí SQL injekcie. Rozšírenie PDO je navrhnuté tak, aby bojovalo proti injekciám, ale jednoducho tak, štandardne, to nerobí.

Pozrime sa na problém na príklade. Predpokladajme, že máme nasledujúci dopyt, do ktorého sa vkladá premenná:

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

Predpokladajme, že naša premenná prichádza odniekiaľ zvonku, napríklad z GET parametra. Pre jednoduchosť, však, ju jednoducho nastavme ručne. Očakávame nejakú číselnú hodnotu, napríklad takúto:

php<?php
  $id = 1;
?>

Zlomyseľný hacker, však, môže odoslať nasledujúcu hodnotu (predpokladajme, že máme pole role):

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

Výsledkom je, že sme chceli nasledujúci dopyt:

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

Ale dostali sme nasledujúci, ktorý vytiahne administrátora stránky:

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

Aby sme sa vyhli tejto situácii, v PDO je pripravený špeciálny mechanizmus, ktorý sa nazýva prípravené dopytov. Tie si rozoberieme v nasledujúcej lekcii.

Задание 1

Úmyselne vykonajte SQL injekciu do vašej databázy.