Bademeister: PHP / MySQL Sicherheit

Beitrag lesen

Sorry, aber wenn es so ist frage ich mich ernsthaft warum so viel Tohuwabohu um das Wörtchen Prüfungen gemacht werden!

Natürlich ist das Prüfen der Inhalte oft wichtig, aber nicht einfach um des Prüfens willen. Im Grunde ist die Aussage, die Werte dürfen nicht ungeprüft verwandt werden, völlig leer, wenn man nicht dazu sagt, was man denn eigentlich prüfen will. Sag doch mal selber: wenn ich in ein Formular einen Text schreiben soll, der dann in einer Datenbank gespeichert wird - sagen wir eine Nachricht an Dich - *was* genau willst Du da bei dem eingegebenen Text jetzt prüfen?

Ernsthaft, mir raucht schon der Kopf, in Abermillionen Webseiten steht prüfen, prüfen

Was denn prüfen?

Also z.B. bei einem select Feld die Auswahl mit einem Array vergleichen.

Zum Beispiel. Bei einem Select-Feld dürfte meistens die Situation vorliegen, dass nur wenige Werte erlaubt sind, nämlich die angebotenen. Ob Du die in einem Array stehen hast oder wie die Prüfung genau aussieht, musst Du wissen.

Sollte die Auswahl nicht im Array enthalten sein dann Abbruch, richtig?

Skript abbrechen? Klingt nicht gut. Vielleicht eher einen Hinweis ausgeben und dem User das Formular nochmals anbieten?

Wenn andersherum ein User einen beliebigen String angeben darf, worauf willst Du dann pruefen?

Stell Dir mal vor ein User tippt anstatt Bistro's Bistros\’s ein, hier würde die mysql_real_escape_string Funktion den String ein zweites Mal maskieren!

Wenn einer in des Feld "Bistro's" eintippt, dann würde ich zunächst mal davon ausgehen, dass der String, den er eintippen wollte, eben "Bistro's" ist. Sonst hätt ers ja nicht eingetippt. Und dann speicher ich den String auch ab. Wenn Du einen guten Grund hast, dem User zu verbieten, die Zeichenfolge "'" in seinem String zu haben, dann sag mal, was Du eigentlich vorhast.

Da wäre es doch nicht falsch, bevor mysql_real_escape_string angewandt wird, auf Maskierungen zu achten und im Gegebenenfall stripslashes anzuwenden, oder täusche ich mich da?

Die Eingabe einfach stillschweigend zu verändern und so zu tun, als habe der Benutzer etwas anders eingegeben, als er tatsächlich hat, halte ich für so fast immer die falsche Vorgehensweise. Wenn er einen ungültigen String eingegeben hat, teile es ihm mit, und wenn nicht, dann nimm seine Eingabe.

Was sind es denn eigentlich fuer Werte? Warum ist es ein Problem, wenn einer einen Zeilenumbruch eingibt?

Da bei einem Request(POST) keine Informationen über den Typ eines Formularfeldes übertragen werden, wird auch keine Information übertragen ob überhaupt das eigene Formular genutzt wurde, es sei den man benutzt eine Session für eine Formularidentifikation. Also stelle Dir auch hier einfach vor, jemand versucht mit einem fremden Formular auf Dein Script zuzugreifen und nimmt anstatt ein:

<input type="text" name="textfield1" />

eine

<textarea name="textfield1">

Das ist doch *total* egal, auf welche Weise der Client den Request produziert hat. Es ist nur interessant, *welche* Werte er übergibt. Was Du für Werte erwartest, hat einzig und allein mit dem Zweck und der Logik Deines Skriptes zu tun. Diese ganzen HTMl- und SQL-Aspekte spielen dabei überhaupt keine Rolle.

Schreibe mal auf einem Blatt Papier *exakt* auf, was Du eigentlich pruefen willst, d.h. welche Strings erlaubt und welche nicht erlaubt sind. Wenn Du das weisst, dann ist es hoechstwahrscheinlich nicht schwierig, die Pruefung zu implementieren.

Wir sind uns mit Sicherheit einig dass dies nicht auf ein Blatt Papier passt! :-)

Nein, sind wir bisher nicht. Ich meinte nicht, das Du alle erlaubten Strings aufschreiben sollst, sondern, dass Du exakt formulieren sollst, was die Kriterien für die Gültigkeit der Strings ist. Was hast Du denn vor?

Viele Grü0e
der Bademeister