A PDO lekérdezések problémái PHP-ben

Ahogy már tudnod kell, az SQL lekérdezések ki vannak téve az SQL-injekcióknak. A PDO bővítményt az injekciók elleni küzdelemre tervezték, de alapértelmezés szerint, önmagában, ezt nem teszi meg.

Nézzük meg a problémát egy példán keresztül. Tegyük fel, hogy van egy lekérdezésünk, amelybe egy változó illesztődik be:

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

Tegyük fel, hogy a változónk kívülről érkezik, például egy GET paraméterből. Az egyszerűség kedvéért azonban csak adjunk meg értéket manuálisan. Egy numerikus értéket várunk, például ezt:

php<?php
  $id = 1;
?>

Egy gonosz hacker azonban átadhatja a következő értéket (tegyük fel, hogy van egy role mezőnk):

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

Így az történik, hogy mi a következő lekérdezést szándékoztuk futtatni:

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

De a következőt kaptuk, amely kiválasztja az oldal adminisztrátorát:

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

Hogy elkerüljük ezt a helyzetet, a PDO-ban előkészített egy speciális mechanizmust, amelyet előkészített utasításoknak hívnak. Ezeket a következő leckében fogjuk részletesen megvizsgálni.

Задание 1

Hajtson végre szándékosan egy SQL-injekciót az adatbázisán.