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
$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
$id = 1;
?>
Zlomyseľný hacker, však, môže odoslať
nasledujúcu hodnotu (predpokladajme, že máme
pole role):
<?php
$id = '-1 OR role="admin"';
?>
Výsledkom je, že sme chceli nasledujúci dopyt:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Ale dostali sme nasledujúci, ktorý vytiahne administrátora stránky:
<?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.
Úmyselne vykonajte SQL injekciu do vašej databázy.