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
$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
$id = 1;
?>
Un hacker rău intenționat, totuși, poate transmite
următoarea valoare (presupunem că avem
câmpul role):
<?php
$id = '-1 OR role="admin"';
?>
Se dovedește că noi am vrut următoarea interogare:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Și am obținut următoarea, care extrage administratorul site-ului:
<?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.
Realizați intenționat o injecție SQL în baza dvs. de date.