Užklausų problemos PDO PHP
Kaip jau turėtumėte žinoti, SQL užklausos yra pažeidžiamos SQL injekcijų. PDO plėtinys sukurtas kovoti su injekcijomis, tačiau pats savaime, pagal numatytuosius nustatymus, jis to nedaro.
Pažvelkime į problemą pavyzdžiu. Tarkime, kad turime tokią užklausą, į kurią įterpiamas kintamasis:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Tarkime, kad mūsų kintamasis ateina iš kažkur išorės, pavyzdžiui, iš GET parametro. Kad būtų paprasčiau, tiesiog nustatykime jo reikšmę rankiniu būdu. Mes tikimės skaitinės reikšmės, pavyzdžiui, tokios:
<?php
$id = 1;
?>
Tačiau piktavalius įsilaužėlis gali perduoti
tokią reikšmę (tarkime, kad mes
turime lauką role):
<?php
$id = '-1 OR role="admin"';
?>
Pasirodo, mes norėjome šios užklausos:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
O gavome tokią, kuri ištraukia svetainės administratorių:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Kad išvengtume tokios situacijos, PDO turi specialų mechanizmą, kuris vadinamas paruoštos užklausos. Jas nagrinėsime kitoje pamokoje.
Sąmoningai atlikite SQL injekciją į savo duomenų bazę.