SQL Warum sind Prepared Statements sicher vor SQL-Injections?

Jack159

Lieutenant
Registriert
Dez. 2011
Beiträge
766
Hallo,

ein Beispiel für Prepared Statements in PHP:

Code:
<?php
$user = $_POST['user'];
$stmt = $dbh->prepare("SELECT user, password FROM tbl_user WHERE user=:user");
$stmt->bindParam(':user', $user);

In diesem Beispiel erfolgt ja keine Typüberprüfung. Mit Typüberprüfung wäre mir das klar, dass keine SQL-Injections möglich sind.

Aber hier kann ich doch genauso folgendes in das Eingabefeld für "user" übergeben: "blabla OR 1=1"
Was ja dann dennoch zu folgendem SQL-Befehl führt:

SELECT user, password FROM tbl_user WHERE user=blabla OR 1=1

Inwiefern soll das obige Beispiel für Prepared Statements vor SQL-Injections schützen? Oder gilt das nur, falls man auch auf Typen der Parameter prüft?
 
Versteh ich nicht...
Am Ende wird doch trozdem letzendlich folgender SQL-Befehl ausgeführt:

SELECT user, password FROM tbl_user WHERE user=blabla OR 1=1
 
Ich will nichts Falsches erzählen, aber IIRC wird der SQL-Ausdruck quasi schon beim prepare-Aufruf geparst und die Parameter erst im Nachhinein quasi eingefügt, sodass der Inhalt von $user ruhig SQL-Befehle enthalten kann, diese den SQL-Parser aber gar nicht mehr erreichen.

Also effektiv 'weiß' das SQL-Dingen schon, was es machen muss, bevor du überhaupt die Parameter übergibst, daher ja auch der Name Prepared Statements.
 
Zuletzt bearbeitet:
Jack159 schrieb:
Versteh ich nicht...
Am Ende wird doch trozdem letzendlich folgender SQL-Befehl ausgeführt:
0w1p hat es bereits gesagt. Query und Parameter werden getrennt gesendet. Die Parameter werden vom Treiber separat escaped (siehe mysql_real_escape_string) und dann in den Query eingefügt. Ohne Prepared Statements (oder ohne mysql_real_escape_string pro Parameter) ist der Query für SQL-Injections anfällig, da evtl. falsch oder gar nicht escaped wird.
 
Ok, dann würde also mein obiges Beispiel einfach nach einem user mit dem Namen "blabla OR 1=1" suchen?
 
Exakt. So hätte man es natürlich auch erklären können, dann wäre es wohl eher klar gewesen :freaky:
 
Zurück
Oben