dedlfix: OOP: Behandlung von Benutzereingaben für Konstruktor

Beitrag lesen

Tach!

Ich übe gerade OOP in PHP anhand kleinerer Beispiele. Dabei konnte ich mir die Frage wann und wie ich Benutzereingaben behandle nicht selbst beantworten.

Behandeln wofür? Damit sollte die Frage schon geklärt sein. Behandele sie wann und wofür du es brauchst an der benötigten Stelle. Ansonsten muss man sich durch das gesamte Programm hindurch merken, was bereits wofür vorbereitet ist. Und unter Umständen ist es dann für andere Anwendungsfälle unbrauchbar. Für Mini-Programme mag das auf den ersten Blick akzeptabel erscheinen. Je größer die Anwendung wird desto unbrauchbarer ist dieser Weg. Die Verarbeitung zwischen Ein- und Ausgabe läuft mit Rohdaten am besten.

  	$benutzer = new Benutzer($name);  
  	echo $benutzer->gruesseBenutzer();  

Die Methode sollte nichts darüber wissen, in welchem Kontext sie aufgerufen wird und welcher Art Behandlung die Daten dafür brauchen. Ebenso sollte sie nicht nur speziell präparierte Daten sondern auch wieder nur Rohformat verarbeiten. Nur so kann ihre eigentliche Aufgabe universal gehalten werden.

  1. Die pauschale Bearbeitung ist vlt. zu kurz gedacht.Wenn ich den Namen bspw. später auch für eine SQL-Abfrage verwenden will, müsste ich diesen ja anders behandeln (mysql_real_escape_string()). Dies spricht dafür, dass ich die Variable immer erst dort behandele, wo eine Behandlung erforderlich ist.

Richtig.

  1. Bei größeren Programmen als das hiesige Beispiel könnte übersehen/vergessen werden, dass 'name' schon behandelt wurde und zu einer doppelten Behandlung führen.

Oder zu gar keiner, wenn du es beim Erstellen vergisst.

Ich bin mir aber nicht sicher, ob ich dem Konstruktor die Variable Name so unbearbeitet übergeben darf oder dadurch eine Sicherheitslücke öffne. Meine Unsicherheit besteht natürlich auch schon bei der vorherigen Behandlung mit htmlspecialchars(), aber dadurch wurde sie mir deutlich.

Bei der Verarbeitung von Rohdaten gibt es eigentlich kein Sicherheitsproblem - wenn PHP an sich korrekt arbeitet. Das entsteht bei der Ausgabe erst, wenn Code und Nutzdaten zusammen in einem Dokument/Text ausgeliefert werden sollen, so wie das bei HTML oder SQL der Fall ist.

Ich habe selbst mal probiert eine Zeichenkette (per Formular als Name) ") echo "Achtung!!!" zu übergeben. Hat zwar nicht geklappt, aber ich bin auch kein Hacker und weiß nicht, auf was für Ideen die so kommen, will aber trotzdem ein möglichst sicheres Script.

Schau mal den Kontextwechsel-Artikel an (zumindest den Anfang), dann solltest du wissen, wie Code-Injections funktionieren und was das Problem beim unbehandelten Einfügen ist.

Darf/sollte ich eine Postvariable unbearbeitetet an den Konstruktor übergeben?

Das kommt auf die Aufgabe der Klasse an. Klassen, die allgemein Daten verarbeiten, bekommen immer Rohdaten.

dedlfix.