Проблеми със заявки в 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 инжекция към вашата база данни.