Проблеме упита у ПДО у ПХП-у

Као што већ морате знати, СКЛ упити су подложни СКЛ-инјекцијама. Проширење ПДО има за циљ да се бори против инјекција, али само тако, подразумевано, оно то не чини.

Хајде да погледамо проблем на примеру. Претпоставимо да имамо следећи упит, у који се убацује променљива:

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

Претпоставимо да наша променљива долази откуд-то споља, на пример, из GET-параметра. Ради једноставности, међутим, хајде само да задамо њену вредност ручно. Очекујемо неку нумеричку вредност, на пример, овакву:

php<?php
  $id = 1;
?>

Злобни хакер, међутим, може проследити следећу вредност (претпоставимо да имамо поље role):

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

Испада да смо желели следећи упит:

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

А добили смо следећи, који извлачи администратора сајта:

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

Да би се избегла таква ситуација, у ПДО је предвиђен посебан механизам, који се зове припремљени упити. Њих ћемо разлагати у следећој лекцији.

Задание 1

Намерно извршите СКЛ-инјекцију на вашу базу података.