Klasse zum validieren von Formular-Benutzereingaben

  • Tach Dynamiker,


    im Laufe der Zeit sammelt sich wohl jeder so einiges an Schnipsel zusammen, die man dann als Funktionen in seinen Projekten benutzt. Was man quasi bei jedem PHP-Projekt braucht ist eine Möglichkeit Benutzereingaben in Formularen zu validieren, um sich vor böswilligen Attacken zu schützen.


    Aus diesem Grund habe ich mal meine eigene Validator Klasse zusammen gestellt, weil das bequemer ist als sich mit etlichen losen Funktionen herumzuplagen. Da ich mir dachte das einige von Euch sowas auch brauchen können, stelle ich die Klasse hier zur Verfügung.


    Hier mal eine kurze Anwendungsbeispiel-Übersicht für die Klasse...



    [highlight]Noch ein Hinweis:[/highlight]
    Auf alle Werte die in die Klasse übergeben werden, wird eine allgemeine Routine ausgeführt. Die umfasst folgende Aktionen:

    • Stripslashes, wenn Magic Quotes auf dem Server aktiv ist
    • Trim um Leerzeichen vor und nach dem Wert zu entfernen
    • \r\n wird in \n umgewandelt
    • Mehr als 3 Zeilenumbrüche werden auf einen neuen Absatz reduziert. (verhindert sinnlose gestreckte Texte)
    • Mehr als 3 Leerzeichen werden auf 2 Leerzeichen reduziert (sinnlosen Whitespace braucht niemand)
    • Übertriebe Zeichen-Wiederholungen werden gekürzt. (z.B. 20 Ausrufungszeichen werden auf 1 Ausrufungszeichen reduziert)
    • Überlange Zeichenketten werden unterbrochen (verhindert das überlange Wörter das Layout sprengen)
    • Potentielle SQL Injections werden blockiert. Dabei wird bei jedem Wert geprüft ob sich ein möglicher SQL Befehl eingeschlichen hat (z.B. drop table oder insert into, etc.)
    • Potentielle Email Injections werden blockiert. Jeder Wert wird auf eventuelle Header Attacken geprüft. (ob z.B. bcc:, content-type:, etc. eingeschleust wurde)
    • Alle RegEx benutzen das normale Alphabet a-z, A-Z und Umlaute, sowie einige wenige Sonderzeichen und französische Akzentzeichen (es soll ja auch Leute geben die z.B. René heissen ;))


    Die verwendeten Regulären Ausdrücke haben bisher gut funktioniert, auch wenn sie nicht allzu "scharf" sind. Wer Verbesserungsvorschläge hat oder einen Schnitzer entdeckt hat, immer her damit - am besten direkt mit einer Lösung/Verbesserung. :)


    Viel Spaß beim validieren!

  • Ich will ja nicht reinreden, aber wäre es nicht besser, für jede Validierung eine eigene Klasse zu schreiben, die ein Interface implementiert? Dann ist das ganze variabler und man muss nicht die Kernklasse anfassen.


    Dann könnte man den eigentlichen Validator instanziieren und beliebig viele Regeln (ergo Klassen) hinzufügen. So in der Richtung:


    PHP
    1. $validator = new Validator();
    2. $validator->addRule('...Regel 1...');
    3. $validator->addRule('...Regel 2...');
    4. $validator->addRule('...Regel 3...');


    Die Regeln sind dann die Klassen, die in Dateien liegen, die genauso heißen wie die Klassen selber.



    EDIT: Ich habe gerade gesehen, dass manuelito unten das etwa so gebaut hat, wie ich meinte..

    ...Meine Meinung :)

  • Ich will ja nicht reinreden, aber Danke! ;)


    Ich hab zwar da so meine eigenen Schnippsel, aber ich finde es Klasse von Dir, so etwas hier hinzustellen! Und da ich Dich nicht bewerten, weil ich erst ein paar andere bewerten, mache ich es auf diesem Weg :D

    Grüße vom Griechen,
    Cybergreek!

  • @ marc22
    Jeder wie er mag; bekanntlich führen viele Wege nach Rom.
    Für kleinere Projekte fange ich persönlich nicht großartig an mit Interfaces und etlichen Klassen zu hantieren, wenn ich alles was ich benötige gebündelt in einer Klasse haben kann. ;)


    @ Cybergreek
    :p

  • Moin alle zusammen,


    das Script ist schon mal ein Anfang. Doch habe ich intensivster Suche noch nicht gefunden, wie man nachfolgendes Script anpassen muss und nicht Mailadressen zu checken, sondern das Formularfeld "Webseite". Viele kommentieren doch nur, um werbewirksam (SEO) ihre Domain abzusetzen.



    Mit einer selbst erstellten Blackliste (txt-datei) könnte man verhindern, dass diese Adressen akzeptiert werden und ein entsprechender Hinweis ausgegeben wird. Als PHP-Neuling fehlt mir dazu allerdings das Fachwissen, vielleicht weißt hier ja jemand mehr dazu. Besten Dank schon mal fürs Lesen ;)

  • Oha ich befürchte jetzt schon die ForenLeichen schreie *g*


    Ich finde ich deine Klasse echt super habe aber 3 Problemchen und hoffe du kannst mir weiterhelfen


    1. Wäre es möglich z.B. mit der Klasse auch zu überprüfen ob bei einem Select Feld etwas ausgewählt worden ist also sprich !empty() ?


    2. Gibt es eine möglichkeit zu überprüfen ob zwei eingaben identisch sind $var1 == $var2 ?? Wäre für "neues Passwort" setzen Interessant.


    3. Fällt eine Url im Format

    Code
    1. http://www.Domain.de/?refid=XYZ&b_id=250

    durch den Check durch.


    Ich danke dir schonmal für die ansich schöne Klasse und auf deine evtl. Hilfe

  • Hallo Duergy


    zu 1)
    Die Klasse validiert Benutzereingaben. Zu prüfen ob überhaupt etwas übermittelt wurde ist nicht Aufgabe der Klasse, sondern des Scripts, dass die Eingabe dann an die Klasse weiterleitet.


    zu 2)
    siehe 1)


    zu 3)
    Kann ich mich jetzt leider nicht näher mit befassen. Alternative ready-to-use Suchmuster findest Du z.B. in der Regular Expression Library oder Du ersetzt die Methode durch eine PHP-interne Funktion [phpfunction]filter_var[/phpfunction] (dazu benötigt FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_HOST_REQUIRED)



    Gruß Andreas



    p.s.: Ich weiß das jeder seine Probleme gerne bereits gestern schon gelöst haben möchte, aber in einem Forum, zumal sonntags abends, muss man eben mal ein bisschen Geduld mitbringen, bis sich jemand dem Problem/den Fragen annimmt. Extra noch per PN darauf hinzuweisen, obwohl noch keine 2 Stunden seit dem Beitrag vergangen sind, ist nicht so gerne gesehen.