Праблемы запытаў у PDO ў PHP

Як вы ўжо павінны ведаць, SQL-запыты ўразлівыя для SQL-ін'екцый. Пашырэнне PDO прызначана для барацьбы з ін'екцыямі, але проста так, па змаўчанні, яно гэтага не робіць.

Давайце паглядзім на праблему на прыкладзе. Хай у нас ёсць наступны запыт, у які ўстаўляецца зменная:

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-ін'екцыю да вашай базы.