Problemele interogărilor în PDO în PHP

După cum ar trebui să știți deja, interogările SQL sunt vulnerabile la injecții SQL. Extensia PDO este concepută pentru a lupta împotriva injecțiilor, dar în mod implicit, nu face acest lucru automat.

Să analizăm problema cu un exemplu. Să presupunem că avem următoarea interogare, în care este inserată o variabilă:

php<?php
  $sql = "SELECT * FROM users WHERE id=$id";
  $res = $pdo->query($sql);
?>

Să presupunem că variabila noastră provine de undeva din exterior, de exemplu, dintr-un parametru GET. Pentru simplitate, totuși, să îi stabilim valoarea manual. Ne așteptăm la o valoare numerică, de exemplu, aceasta:

php<?php
  $id = 1;
?>

Un hacker rău intenționat, totuși, poate transmite următoarea valoare (presupunem că avem câmpul role):

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

Se dovedește că noi am vrut următoarea interogare:

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

Și am obținut următoarea, care extrage administratorul site-ului:

php<?php
  $sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
  $res = $pdo->query($sql);
?>

Pentru a evita o astfel de situație, în PDO este prevăzut un mecanism special, care se numește interogări pregătite. Le vom analiza în lecția următoare.

Задание 1

Realizați intenționat o injecție SQL în baza dvs. de date.