Проблеми со барањата во PDO во PHP
Како што веќе треба да знаете, SQL барањата се подложни на SQL-инјекции. Проширувањето PDO е создадено да се бори против инјекции, но седноставно, по default, тоа не го прави.
Ајде да ја погледнеме проблематиката преку пример. Нека имаме следното барање, во кое се вметнува променлива:
<?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);
?>
За да се избегне ваква ситуација, во PDO е предвиден специјален механизам, кој се вика подготвени барања. Нив ќе ги разгледуваме во следната лекција.
Намерно извршете SQL-инјекција кон вашата база.