Праблемы запытаў у PDO ў PHP
Як вы ўжо павінны ведаць, SQL-запыты ўразлівыя для SQL-ін'екцый. Пашырэнне PDO прызначана для барацьбы з ін'екцыямі, але проста так, па змаўчанні, яно гэтага не робіць.
Давайце паглядзім на праблему на прыкладзе. Хай у нас ёсць наступны запыт, у які ўстаўляецца зменная:
<?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-ін'екцыю да вашай базы.