Sub: PHP / MySQL Sicherheit

Beitrag lesen

Hi Bademeister,

auch an Dir ein Dankeschön für die Stellungnahme!

Oje. Was meinst Du denn mit "pruefen"? Da hast Du diesen Slogan aufgeschnappt, der gut gemeint, aber Unsinn ist.

Sorry, aber wenn es so ist frage ich mich ernsthaft warum so viel Tohuwabohu um das Wörtchen Prüfungen gemacht werden! Ernsthaft, mir raucht schon der Kopf, in Abermillionen Webseiten steht prüfen, prüfen und nochmals prüfen und diese sind nicht vom 26. April 2010 sondern aus Jahren davor!

*Dann*, wenn ein Wert in einer dieser Variablen (also ein vom Client uebergebener Wert) kein beliebiger String sein darf (also nicht alles sein darf, was er technisch sein kann), *dann* musst Du pruefen, ob das, was drin steht, etwas ist, was drinstehen darf.

Also z.B. bei einem select Feld die Auswahl mit einem Array vergleichen.
Sollte die Auswahl nicht im Array enthalten sein dann Abbruch, richtig?

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! 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?

Warum wird denn gleich das Skript abgebrochen? Das klingt nicht sehr benutzerfreundlich.

Da der eigentliche Benutzer davon nicht betroffen ist, hat das schon seine Berechtigung!
Siehe hierzu bitte den Beitrag: http://forum.de.selfhtml.org/archiv/2009/5/t187309/

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">

Resultat ist das im input type="text" kein Umbruch vorgesehen ist, aber in der textarea sind Umbrüche erlaubt. Wenn man also im eigenen Formular ein input type="text" bereitstellt ist es ja wohl logisch das man dort keine Umbrüche haben möchte.

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! :-)
Wenn überhaupt wäre eine Whitelist besser als eine Blacklist, aber auch für die würde ein Blatt nicht ausreichen. Ich habe eingesehen, was man vergleichen kann sollte man auch vergleichen, sprich alles wo der User nur Auswählen kann bei Auswahllisten, Checkboxen und Radioboxen.

Warum sind denn keine Apostrophe erlaubt?

Apostroph soll erlaubt sein, ich wusste nur noch nicht wie ich das in der preg_match unterbringe.

Aber sicher nicht allzu erfolgreich, weil das so geblidete SQL-Statement Syntax-Fehler enthaelt. Vom Ansatz her ist es aber sicher der bessere Weg, als die Variablen erst noch separat umzukopieren. Dafuer gibt es keinen guten Grund.

Der Fehler mit den Hochkomas ist beim kopieren aus Word passiert, Sorry!

Viele Grüße,

Sub