Probleme mit PDO-Abfragen in PHP
Wie Sie bereits wissen sollten, sind SQL-Abfragen anfällig für SQL-Injection. Die PDO-Erweiterung soll Injection bekämpfen, aber standardmäßig tut sie das nicht einfach so.
Schauen wir uns das Problem an einem Beispiel an. Nehmen wir an, wir haben die folgende Abfrage, in die eine Variable eingefügt wird:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Nehmen wir an, unsere Variable kommt von irgendwo außerhalb, zum Beispiel aus einem GET-Parameter. Der Einfachheit halber lassen Sie uns ihren Wert jedoch manuell festlegen. Wir erwarten einen numerischen Wert, zum Beispiel diesen:
<?php
$id = 1;
?>
Ein böswilliger Hacker könnte jedoch
den folgenden Wert übergeben (angenommen, wir
haben ein Feld role):
<?php
$id = '-1 OR role="admin"';
?>
Es stellt sich heraus, dass wir die folgende Abfrage beabsichtigt hatten:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Aber die folgende Abfrage erhalten haben, die den Website-Administrator ausgibt:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Um eine solche Situation zu vermeiden, bietet PDO einen speziellen Mechanismus, der vorbereitete Abfragen genannt wird. Diese werden wir in der nächsten Lektion behandeln.
Führen Sie absichtlich eine SQL-Injection auf Ihre Datenbank durch.