PDO-ში მოთხოვნების პრობლემები PHP-ში

როგორც უკვე უნდა იცოდეთ, SQL მოთხოვნები დაუცველია SQL-ინექციების მიმართ. PDO გაფართოება შექმნილია ინექციებთან საბრძოლველად, მაგრამ ის, უბრალოდ, ნაგულისხმევად, ამას არ აკეთებს.

მოდით, პრობლემა მაგალითზე ვნახოთ. დავუშვათ, გვაქვს შემდეგი მოთხოვნა, რომელშიც ცვლადი ჩასმულია:

php<?php
  $sql = "SELECT * FROM users WHERE id=$id";
  $res = $pdo->query($sql);
?>

დავუშვათ, ჩვენი ცვლადი სადმე გარედან მოდის, მაგალითად, GET-პარამეტრიდან. მარტივებისთვის, მაგრამ, მოდით, უბრალოდ მისი მნიშვნელობა ხელით დავაყენოთ. ჩვენ ველით რაღაც ციფრულ მნიშვნელობას, მაგალითად, ასეთს:

php<?php
  $id = 1;
?>

ბოროტი ჰაკერი, however, შეიძლება გადასცეს შემდეგი მნიშვნელობა (ჩავთვალოთ, რომ ჩვენ გვაქვს ველი role):

php<?php
  $id = '-1 OR role="admin"';
?>

გამოდის, რომ ჩვენ გვინდოდა შემდეგი მოთხოვნა:

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

და მივიღეთ შემდეგი, რომელიც ამოიღებს საიტის ადმინისტრატორს:

php<?php
  $sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
  $res = $pdo->query($sql);
?>

ასეთი სიტუაციის თავიდან ასაცილებლად, PDO-ში გათვალისწინებულია სპეციალური მექანიზმი, რომელსაც ეწოდება მომზადებული მოთხოვნები. მათ შემდეგ გაკვეთილზე გავაანალიზებთ.

Задание 1

განზრახ განახორციელეთ SQL-ინექცია თქვენს ბაზაზე.