dedlfix: Formulardaten per E-Mail senden

Beitrag lesen

Hi!

User gibt seinen Namen ein: "Robert'); DROP TABLE Students;"
Ich hab also nur nen String. Ich kann den auf dem Monitor ausgeben, in eine Datenbank schreiben oder mailen...
Ungeprüft ist der erstmal nur kritisch in der zweiten Situation. Es ist aber völlig egal, was ich wann damit mache: Es bleibt eine Usereingabe.

Nö, bleibt es nicht, weil ich die Eingabe zusammen mit anderen Daten in eine Datei schreibe. Wenn ich die Datei lese, habe ich keine Usereingabe mehr, sondern Daten aus einer Datei. Die mixe ich munter und froh mit Daten aus anderen Quellen zusammen. Dass ein Teil, der nicht mal mehr zusammenhängen muss, mal eine Usereingabe war, kann man nun nicht mehr eindeutig sehen. Trotzdem können diese Daten Zeichene enthalten, die eine Sonderbedeutung in bestimmten Ausgabemedien haben. Und es sind sogar noch welche hinzugekommen, die nicht durch eine Eingabedatenprüfung (worauf auch immer) gegangen sind. Denn irgendwann nun - die Usereingabe ist mittlerweile völlig in Vergessenheit geraten - will ich eine Ausgabe vornehmen. Es interessiert nun nicht mehr, dass das eine Usereingabe war, sondern nur die aktuellen Zeichen in den Daten.

Wir behandeln mit diesem String also immer eine Usereingabe. Nehmen wir also den Fall, daß ich mit diesem Namen einen Datenbankquery erstelle: Wenn ich das Teil einfach so übernehme, habe ich ein Problem. Also muss ich das Teil entschärfen, wie Du es so schön nennst. Wie mache ich das? Ich prüfe es auf Gefahrenpotential und behandle den String.

Eine Methode ist, jedes einzelne Zeichen auf seine Sonderbedeutung zu prüfen und es gegebenenfalls zu maskieren. Doch das macht man nicht per Hand, dafür gibt es Funktionen. Die betrachte ich als Blackbox, und ob die was prüfen, etwas berechnen, eine Kodierung (z.B. Base64) oder eine Typumwandlung durchführen, ist mir egal. Sie geben einen kontextgerecht behandelten Wert zurück. Die Behandlung für das Ausgabemedium können also auch ganz andere Vorgänge als eine Prüfung sein.

Egal wie Du es nennst. Ich muss eine Usereingabe pruefen. Ich weiß nicht, ob Du hier nur extrem penibel bist und beim stumpfen escapen von z.B. allen '  keinerlei Pruefung siehst.
Ich komm immer noch nicht drauf, was Dein Problem ist.

Du kommst nicht auf die sichere Seite, wenn du lediglich eine Eingabedatenprüfung vornimmst. Wichtig ist eine Ausgabedatenbehandlung, und die muss keine Prüfung sein. Deshalb möchte ich nicht mehr "prüfe unbedingt deine Eingabedaten" lesen, sondern "behandle unbedingt deine Ausgabedaten".

Lo!