PDO-дағы сұраулардың мәселелері PHP-те
Сіз білуіңіз керек, 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-инъекцияны әдейі жүргізіңіз.