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