Problemy zapytań w PDO w PHP
Jak już powinieneś wiedzieć, zapytania SQL są podatne na iniekcje SQL. Rozszerzenie PDO ma na celu zwalczanie iniekcji, ale domyślnie, samo z siebie, tego nie robi.
Przyjrzyjmy się problemowi na przykładzie. Załóżmy, że mamy następujące zapytanie, do którego wstawiana jest zmienna:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Załóżmy, że nasza zmienna pochodzi skądś z zewnątrz, na przykład z parametru GET. Dla uproszczenia, jednak, po prostu ustawmy jej wartość ręcznie. Oczekujemy pewnej numerycznej wartości, na przykład takiej:
<?php
$id = 1;
?>
Złośliwy haker, jednak, może przekazać
następującą wartość (przyjmijmy, że mamy
pole role):
<?php
$id = '-1 OR role="admin"';
?>
Okazuje się, że chcieliśmy następujące zapytanie:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
A otrzymaliśmy następujące, które wyciąga administratora strony:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Aby uniknąć takiej sytuacji, w PDO przewidziano specjalny mechanizm, który nazywa się zapytania przygotowane. Będziemy je omawiać w następnej lekcji.
Celowo dokonaj iniekcji SQL do swojej bazy danych.