dedlfix: Daten werden nicht ausgelesen

Beitrag lesen

Hi!

$id = $_GET["id"];
$res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");
Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/
Falsch. Schon mal was von SQL injection gehört? ;)

Alles Escaping nützt nichts, wenn man es falsch anwendet. Angenommen, der Funktionsaufruf wäre so eingebunden, dass er wirken könnte, so beispielsweise:

$res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", mysql_escape_string($id)));

dann würden zwar in $id enthaltene ' und " zu ' und " gewandelt, aber da keine Anführungszeichen um den eingefügten Wert drumherum stehen, ist auch kein String-Kontext eingeleitet worden. Das Statement befindet sich immer noch im Anweisungsmodus und man kann ohne sich zu verrenken beliebige SQL-Syntax-Elemente einfügen. Und wenn man in dem Zustand selbst Strings einfügen möchte, nimmt man die Hex-Schreibweise, so dass die '"-Konvertierung nicht stört.

Die entsprechende Stelle im Kontextwechsel-Artikel wäre: Zahlen im (My)SQL-Statement

Also entweder (beispielsweise durch Zwangskonvertierung in einen Integerwert: intval(), Typecast) sicherstellen, dass wirklich nur eine Zahl das SQL-Statement erreicht oder mit mysql_real_escape_string() _und_ Anführungszeichen arbeiten (oder Prepared Statemens verwenden).

$res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", intval($_GET["id"])));
$res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", (int)$_GET["id"]));

$res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = '%s'", mysql_real_escape_string($_GET["id"])));

Lo!