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<?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<?php
  $id = 1;
?>

Złośliwy haker, jednak, może przekazać następującą wartość (przyjmijmy, że mamy pole role):

php<?php
  $id = '-1 OR role="admin"';
?>

Okazuje się, że chcieliśmy następujące zapytanie:

php<?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<?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.

Задание 1

Celowo dokonaj iniekcji SQL do swojej bazy danych.