Проблеме упита у ПДО у ПХП-у
Као што већ морате знати, СКЛ упити су подложни СКЛ-инјекцијама. Проширење ПДО има за циљ да се бори против инјекција, али само тако, подразумевано, оно то не чини.
Хајде да погледамо проблем на примеру. Претпоставимо да имамо следећи упит, у који се убацује променљива:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Претпоставимо да наша променљива долази откуд-то споља, на пример, из GET-параметра. Ради једноставности, међутим, хајде само да задамо њену вредност ручно. Очекујемо неку нумеричку вредност, на пример, овакву:
<?php
$id = 1;
?>
Злобни хакер, међутим, може проследити
следећу вредност (претпоставимо да имамо
поље role):
<?php
$id = '-1 OR role="admin"';
?>
Испада да смо желели следећи упит:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
А добили смо следећи, који извлачи администратора сајта:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Да би се избегла таква ситуација, у ПДО је предвиђен посебан механизам, који се зове припремљени упити. Њих ћемо разлагати у следећој лекцији.
Намерно извршите СКЛ-инјекцију на вашу базу података.