dedlfix: Sortierung über URL und den ORDER-Befehl

Beitrag lesen

echo $begrüßung;

Wenn $_GET['orby'] unbehandelt bleibt,
"SELECT * FROM buecher ORDER BY ".mysql_real_escape_string($_GET['orby'])." ASC";

Das ist die Stelle mit der Sicherheitslücke trotz mysql_real_escape_string(). Diese Funktion ist für Strings geeignet, die in '' oder "" eingefasst sind. Einen solchen hast du hier aber gar nicht vorliegen. Wenn du »0 UNION SELECT * FROM mysql.users« eingibst, hat mysql_real_escape_string() nichts zu tun, weil keine von ihr behandelten Zeichen vorkommen. Dein SQL-Statement sieht nun aber so aus: »SELECT * FROM buecher ORDER BY 0 UNION SELECT * FROM mysql.users«. Man muss nun lediglich noch dafür sorgen, dass die Spaltenanzahl des UNIONierten Select-Ergebnisses die gleiche ist wie die des ersten und ... siehst du jetzt das Problem an der Geschichte?

Die Angabe hinter "ORDER BY" muss allerdings kein Text sein, den man escapen könnte, sondern eine existierende Tabellenspalte.

Der Teil ab "sondern" ist so nicht richtig. Normalerweise muss es eine Spalte aus der SELECT-Klausel sein oder dessen Alias oder dessen Position von 1 und links an gezählt. Zumindest unter MySQL lässt sich aber auch eine am Ergebnis unbeteiligte Spalte der Tabelle angeben und außerdem auch noch die Funktion RAND(), um das Ergebnis zufällig gemischt zu erhalten.

echo "$verabschiedung $name";