PHP да PDO суроваларидаги муаммолар
Сиз билишингиз керакки, SQL суровлари SQL-инъекцияларига учрайди. PDO кенгайтмаси инъекцияларга қарши кураши учун яратилган, лекин оддий ҳолда, сунъий холда, у бу ишни қилмайди.
Келинг, муаммони мисолда кўрамиз. Фарз қилайлик, бизда куйидаги суров бор, унга ўзгарувчи киритилган:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Фарз қилайлик, бизнинг ўзгарувчимиз қаердир ташқаридан келади, масалан, GET-параметридан. Оддийлик учун, аммо, келинг унинг қийматини қўлда киритайлик. Биз бирор сонли қиймат кутямиз, масалан, куйидаги:
<?php
$id = 1;
?>
Бирок, ёмон хакер куйидаги
қийматни юбора олади (бизда role)
майдони бор деб ҳисоблаймиз):
<?php
$id = '-1 OR role="admin"';
?>
Маълум булдики, биз куйидаги суровни хохлаган эдик:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Аммо куйидагини олдик, у эса веб-сайт администраторини олиб беради:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Бундай вазиятдан қочиш учун, PDO да махсус механизм тадким этилган, у тайёрланган суровлар деб аталади. Уларни кейинги дарсда кўриб чиқамиз.
Ўз базазингизга қарши SQL-инъекцияни амалга оширинг.