Christian Seiler: SQL-Injection

Beitrag lesen

Hallo Matze,

Zunächst einmal solltest du wissen, dass es bei einem SELECT Statement nicht ganz so tragisch wie bei einem DELETE oder INSERT ausschaut.

Nur unwesentlich. ;-) Beispiel:

$query = "SELECT feld1, feld2 FROM tabelle WHERE id = '".$_GET['id'].'"';

Übergebe ich jetzt folgenden String: »0' UNION ALL SELECT username as feld1, password as feld2 FROM users WHERE 1 OR '«.

Dann wird aus dem Query ein:

SELECT feld1, feld2 FROM tabelle WHERE id = '0' UNION ALL SELECT username as feld1, password as feld2 FROM users WHERE 1 OR ''

Und schwupps habe ich Deine komplette User-Datenbank. Und wenn die Passwörter im Klartext gespeichert werden oder ungesaltet gehasht werden, dann hat man als Angreifer eigentlich schon gewonnen.

Nur so als Beispiel, warum SELECT im Prinzip genauso böse ist.

PS: derzeit versuche ich mit Select * FROM Tabelle WHERE ID='addslashes(htmlentities(htmlspecialchars($_GET['ID'])))' Codeeinspeisung zu verhindern. Ist dies der richtige Weg?

Absolut nicht.

ACK.

Der richtige Weg wäre ID=mysql_real_escape_string($_GET['ID')]. Mehr nicht.

ACHTUNG! Hier muss man _höllisch_ aufpassen!

$query = "SELECT ... WHERE id = ".mysql_real_escape_string ($_GET['id']); -> SICHERHEITSLÜCKE

Warum? Weil die Funktion mysql_real_escape_STRING heißt, d.h. für STRINGS gedacht ist. Wenn Du unter der Annahme, es handelt sich um eine Zahl, die Zahl einfach in den Query schreibst, dann nützt Dir mysql_real_escape_string nichts, weil in einem String wie »1 UNION ALL ...« nichts drin ist, was escapet werden müsste (keine ' etc.)!

$query = "SELECT ... WHERE id = '".mysql_real_escape_string ($_GET['id'])."'"; -> hat das Problem nicht.

Viele Grüße,
Christian