Malcolm Beck´s: Sortierung über URL und den ORDER-Befehl

Beitrag lesen

hi,

"SELECT * FROM buecher ORDER BY ".$_GET['orby']." ASC";
Was du auf jedenfall tun solltest ist die Endgültige Abfrage immer mit mysql_real_escape durchführen.
Du produzierst hier gerade höheren Unsinn.

Du hast mich vermutlich nur falsch verstanden.

Auf der einen Seite forderst du bei einem ziemlich gut durch mysql_real_escape_string() abgesicherten Query noch irgendeine weitergehende Validierung.

Nönönö, ich habe nichts gefordert und auch noch keine Validierung vorgenommen, wenn OP direkt mit $_GET arbeiten möchte, dann sollte er wenigstens mysql_real_escape_string verwenden, dass war gemeint.
Wenn $_GET schon vorher Validiert wird, ist klar, das man es nicht doppelt bearbeiten muss.

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

Dann aber baust du dem Fragesteller einen Query mit nacktem GET-Parameter zusammen, bei dem man prinzipbedingt keinerlei Escaping einbauen kann, und gehst mit keiner Silbe darauf ein, dass du da gerade das perfekte Einfallstor für SQL-Injection gebaut hast.

OP ist die Funktion mysql_real_escape_string nicht Fremd, siehe Ausgangsposting, dass die Eingaben Validiert werden sollten hatte ich in meinem ersten Posting schon erwähnt, da OP dass Script aber nur für eigene Anwendungen benötigt, reicht mMn auch ein mysql_real_escape_string.

"SELECT * FROM buecher WHERE Verlag = 'O'Reilly'"
Dieser Angriff kann nicht stattfinden, da im Query des OP mysql_real_escape_string() für diesen Teil ja verwendet wird.

Ja, das war nur ein Beispiel für den Fall, das $_GET eben unmaskiert an das SELECT übergeben wird,

 xyz.php?verlag=o'reilly  
  
 SELECT * FROM buecher ORDER BY '".$_GET['verlag']."' ASC";

Die Angabe hinter "ORDER BY" muss allerdings kein Text sein, den man escapen könnte, sondern eine existierende Tabellenspalte. Hier sind also besondere Maßnahmen notwendig, man kann nicht einfach einen beliebig manipulierbaren GET- (oder POST-) Parameter verwenden und direkt in den Query einbauen!

Da stimme ich zu, da war ich wirklich zu voreilig und hab da garnicht dran gedacht.

Man muss verhindern, dass irgendetwas anderes als eine der erlaubten, existierenden Spaltennamen in den Query hineinkommt.

Ganz meine rede, wenn auch in einem anderen Kontext.

holla holla

--
Alle Angaben ohne Gewehr.
Hey, wenn's dir nicht gefällt, mach neu ...