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
$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
$id = 1;
?>
Egy gonosz hacker azonban átadhatja
a következő értéket (tegyük fel, hogy van
egy role mezőnk):
<?php
$id = '-1 OR role="admin"';
?>
Így az történik, hogy mi a következő lekérdezést szándékoztuk futtatni:
<?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
$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.
Hajtson végre szándékosan egy SQL-injekciót az adatbázisán.