Sven Rautenberg: Sortierung über URL und den ORDER-Befehl

Beitrag lesen

Moin!

Wenn ich einen "Aufruf" über GET mache, besteht die Gefahr, dass der Besucher der Seite Mißbrauch betreibt.

Das siehst du falsch. Schon indem du eine Seite im Web hast, besteht die Gefaht, dass der Besucher der Seite Mißbrauch betreibt. Er könnte es zumindest versuchen.

Dass die Parameter, auf die dein Skript unterschiedlich reagieren soll, sich in der URL befinden, erleichtert zwar das daran herumspielen, aber das funktioniert genauso auch mit POST-Formularen, oder den Inhalten von Cookies.

Gibt es denn eine Art "Liste" von Möglichkeiten, mit denen man sich absichern kann?

Ich tendiere dazu, "nein" zu sagen. Da jedes Skript anders programmiert sein kann, können auch jeweils vollkommen individuelle Lücken drin stecken.

Allerdings gibt es durchaus typische Fehler, die sehr häufig gemacht werden und deshalb auch sehr häufig ausgenutzt werden, um Unsinn zu machen.

Eines dieser Dinge ist die Fragestellung: Was bedeuten für das Programm die Daten in einer Variablen?

Mögliche Antworten wären: 1. reiner Text, 2. zwingend eine Zahl, 3. formatierender Code wie z.B. HTML oder 4. Programmcode (oder Stücke davon) wie z.B. PHP oder SQL.

Die zweite Fragestellung ist dann: In welchem Kontext wird der Variableninhalt verwendet?

Wenn ich reinen Text in einer Datei oder Seite vom Typ "text/plain" ausgebe, ändert sich der Kontext nicht. Wenn ich reinen Text in einer HTML-Umgebung ausgebe, ändert sich der Kontext: Plötzlich haben einige Zeichen eine andere Bedeutung und müssen umgewandelt werden, damit der in der HTML-Umgebung angezeigte Text auch identisch bleibt.

Dasselbe gilt beim Einbau einer Benutzereingabe in SQL: Der zunächst "reine Text" kommt jetzt in den Kontext "Datenstring im SQL-Query". Auch dort bedeuten einige Zeichen jetzt etwas anderes (beispielsweise Anführungsstriche innerhalb des Textes - die sollen den String ja nicht beenden, sondern als "hier ist ein Anführungsstrich" durchgehen), und müssen deshalb umgewandelt werden.

Und auch für Inhaltstyp 4 hat dieser Thread schon ein Beispiel: Die Angabe, wie zu sortieren ist, ist ein Stück Programmcode, nämlich SQL. Auch der kann nicht einfach unbesehen durchgereicht werden! Mein Vorschlag, diese Stücke aus einer vorgefertigten Tabelle zu entnehmen, sorgt dafür, dass garantiert nur Programmstücke benutzt werden, die du in diese Tabelle hineingeschrieben hast. Denn bei Programmstücken, die man als Angreifer frei formulieren kann, gibt es viel zu viele Freiheiten, den zu verursachenden Schaden durch geschicktes Verstecken unsichtbar zu machen. Zugegeben, beim SQL von MySQL sind die Möglichkeiten nicht so groß, weil MySQL selbst nicht so wahnsinnig gut programmierbar ist, und insbesondere der PHP-Befehl mysql_query() nicht die notwendigen Mehrfachkommandos durchreichen kann. Aber du kannst dir sicher vorstellen, dass es auch Leute gibt, die die Idee haben, ein Stückchen PHP-Code vom Benutzer entgegenzunehmen und dann mit eval() auszuführen. Und das ist wirklich eine extrem blöde Idee.

Um zu lernen, was man tun oder besser lassen sollte, bleibt dir kaum etwas anderes übrig, als dich selbst zu informieren, in Foren mitzulesen (diese Themen werden immer wieder auftauchen), deinen Code auch mal Dritten zum Durchgucken zur Verfügung zu stellen und auf Ratschläge zu hören, und letztendlich deine eigenen Erfahrungen zu sammeln. Ich bin sicher, es gibt auch etliche gute Blogs - aber wenn ich dir jetzt z.B. Stefan Essers Blog http://www.suspekt.org/ empfehle, überfordert dich das vielleicht noch etwas.

- Sven Rautenberg

--
"Love your nation - respect the others."