Проблеми со барањата во PDO во PHP

Како што веќе треба да знаете, SQL барањата се подложни на SQL-инјекции. Проширувањето PDO е создадено да се бори против инјекции, но седноставно, по default, тоа не го прави.

Ајде да ја погледнеме проблематиката преку пример. Нека имаме следното барање, во кое се вметнува променлива:

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);
?>

За да се избегне ваква ситуација, во PDO е предвиден специјален механизам, кој се вика подготвени барања. Нив ќе ги разгледуваме во следната лекција.

Задание 1

Намерно извршете SQL-инјекција кон вашата база.