PDO-ში მოთხოვნების პრობლემები PHP-ში
როგორც უკვე უნდა იცოდეთ, SQL მოთხოვნები დაუცველია SQL-ინექციების მიმართ. PDO გაფართოება შექმნილია ინექციებთან საბრძოლველად, მაგრამ ის, უბრალოდ, ნაგულისხმევად, ამას არ აკეთებს.
მოდით, პრობლემა მაგალითზე ვნახოთ. დავუშვათ, გვაქვს შემდეგი მოთხოვნა, რომელშიც ცვლადი ჩასმულია:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
დავუშვათ, ჩვენი ცვლადი სადმე გარედან მოდის, მაგალითად, GET-პარამეტრიდან. მარტივებისთვის, მაგრამ, მოდით, უბრალოდ მისი მნიშვნელობა ხელით დავაყენოთ. ჩვენ ველით რაღაც ციფრულ მნიშვნელობას, მაგალითად, ასეთს:
<?php
$id = 1;
?>
ბოროტი ჰაკერი, however, შეიძლება გადასცეს
შემდეგი მნიშვნელობა (ჩავთვალოთ, რომ ჩვენ
გვაქვს ველი 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-ინექცია თქვენს ბაზაზე.