Ergebnis 1 bis 8 von 8

Thema: Klasse zum validieren von Formular-Benutzereingaben

  1. #1
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678

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

    PHP-Code:
    <?php

    // Klasse einbinden
    include( 'validator.class.php' );

    // Validator Objekt erzeugen
    $formular = new Validator();

    /* --------------------------- */
    /* --- Anwendungsbeispiele --- */
    /* --------------------------- */

    /**
     * Zahlen - nur Ziffern werden als gültig erkannt
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $zahl 123456789;
    $formular->pruefeZahl$zahl'Zahl' );


    /**
     * Postleitzahl - nur 5-stellige Zahlen werden als gültig erkannt
     * 12345 = true
     * 93746 = true
     * 45x98 = false
     * 123.4 = false
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $plz 12345;
    $formular->pruefePLZ$plz'PLZ' );


    /**
     * Datum - nur ein gültiges Datum im deutschen Format wird als gültig erkannt
     * 15.7.2004  = true ( Trennzeichen = . )
     * 15-7-2004  = true ( Trennzeichen = - )
     * 15/7/2004  = true ( Trennzeichen = / )
     * 29.02.2008 = true
     * 29.02.2007 = false
     * 31.11.2008 = false
     * 24 12 2008 = false
     *
     * Parameter: Wert, Feld-Bezeichnung, Trennzeichen
     */
    $datum '24.12.2008';
    $formular->pruefeDatum$datum'Datum''.' );


    /**
     * Telefonnummer - Zahlen mit Telefonnummer-Struktur werden als gültig erkannt
     * 0123 45678    = true
     * +49 123 45678 = true
     * (0) 123 45678 = true
     * 0123 45 678   = true
     * 0123 / 45678  = true
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $telefonnummer '0123 / 45678';
    $formular->pruefeTelefon$telefonnummer'Telefonnummer' );


    /**
     * Geldbetrag - Nur Geldbetrag-Strukturen werden als gültig erkannt
     * 399          = true
     * 399,49       = true
     * 1.399,00     = true
     * 1.000.000    = true
     * 1.234.567,89 = true
     * 399,499      = false
     * 23.45,99     = false
     * 0399         = false
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $geldbetrag '1.234.567,89';
    $formular->pruefeGeldbetrag$geldbetrag'Geldbetrag' );


    /**
     * Wort - nur einzelne Wörter bestehend aus Buchstaben werden als gültig erkannt
     * Baumhaus     = true
     * Karl-Heinz   = false
     * Route66      = false
     * Schreibtisch = false (FALSE wenn Maximallänge z.B. 10 Zeichen beträgt)
     * CSS          = false (FALSE wenn Mindestlänge z.B. 5 Zeichen beträgt)
     *
     * Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
     * Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
     */
    $wort 'Audi';
    $formular->pruefeWort$wort'Automarke'320 );


    /**
     * Name - nur Wörter mit Namen-Struktur werden als gültig erkannt
     * Max Mustermann       = true
     * Prof. Max Mustermann = true
     * Mister O'Leary       = true
     * Karl-Heinz Schmitt   = true
     * Fritz Fischer 3.     = false
     * Klaus Kleister       = false (FALSE wenn Maximallänge z.B. 10 Zeichen beträgt)
     * Kalle                = false (FALSE wenn Mindestlänge z.B. 7 Zeichen beträgt)
     *
     * Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
     * Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
     */
    $name 'Prof. Dr. Max Mustermann';
    $formular->pruefeName$name'Benutzername'550 );


    /**
     * Text - normaler Text wird als gültig erkannt
     *
     * Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
     * Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
     */
    $text 'Hier steht belangloser Text der eeewig lang sein kann.';
    $formular->pruefeText$text'Nachricht'151500 );


    /**
     * Email-Adresse - Nur Email-Adressen werden als gültig erkannt
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $email 'jemand@irgendwo.de';
    $formular->pruefeEmail$email'Email' );


    /**
     * Web-Adresse - Nur Web-Adressen werden als gültig erkannt
     * http://www.domain.de    = true
     * www.domain.de           = true
     * https://www.domain.de   = true
     * http://domain.de        = true
     * www.domain.de/seite.htm = true
     *
     * Parameter: Wert, Feld-Bezeichnung
     */
    $url 'http://www.eine-domain.de';
    $formular->pruefeURL$url'URL' );



    /**
     * Abfrage ob Fehler aufgetreten sind und diese ggfs. ausgeben.
     * getError() liefert ein Array zurück dessen Schlüssel den Feldnamen
     * entspricht, die man bei den Methoden-Aufrufen übergeben hat.
     * Der Wert enthält die Fehlermeldung, die in der Klasse gesetzt wurden.
     * Natürlich kann man auch statt $fehler eigene Meldungen ausgeben.
     */
    if (count$formular->getError() ) > 0)
    {
        foreach (
    $formular->getError() as $feld => $fehler)
        {
            echo 
    $feld': ' .$fehler"<br />\n";
        }
    }

    ?>
    Noch ein Hinweis:
    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!
    Angehängte Dateien Angehängte Dateien

  2. #2
    TP-Veteran
    Registriert seit
    May 2006
    Beiträge
    1.572
    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-Code:
    $validator = new Validator();
    $validator->addRule('...Regel 1...');
    $validator->addRule('...Regel 2...');
    $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..
    Geändert von marc22 (29.05.2008 um 13:27 Uhr)
    ...Meine Meinung

  3. #3
    TP-Moderator Avatar von Cybergreek
    Registriert seit
    Nov 2005
    Ort
    Köln
    Beiträge
    1.666
    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
    Grüße vom Griechen,
    Cybergreek!

    everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht

  4. #4
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    @ 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

  5. #5
    TP-Veteran
    Registriert seit
    May 2006
    Beiträge
    1.572
    Na klar. Ist mir nur vorhin so durch den Kopf gegangen, als ich mir das anschaute.
    ...Meine Meinung

  6. #6
    TP-Newbie
    Registriert seit
    Jun 2009
    Beiträge
    1

    Domain überprüfen mit eigener Blacklist

    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.

    PHP-Code:
    <?php
    function checkAddress($Address$BlacklistPath ""){
      if(!
    preg_match("/^[A-Z0-9._%+-ÄÖÜäöü]+@[A-Z0-9.-ÄÖÜäöü]+\.[A-Z]{2,6}$/i"$Address))
        return 
    false;
      
      list(
    $LocalPart$DomainPart) = explode("@"$Address);
      
      if(
    $BlacklistPath){
        if(!
    is_file($BlacklistPath))
          return 
    false;
        
        if((
    $BlacklistedDomains file($BlacklistPath)) === false)
          return 
    false;
        
        foreach(
    $BlacklistedDomains as $BlacklistedDomain){
          if(
    trim($BlacklistedDomain) == $DomainPart)
            return 
    false;
        }
      }
      
      if((
    $Connection = @fsockopen($DomainPart80$ErrorNumber$ErrorString5)) === false)
        return 
    false;
      
    fclose($Connection);
      
      return 
    true;
    }
    ?>
    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

  7. #7
    TP-Newbie Avatar von Duergy
    Registriert seit
    Jan 2010
    Beiträge
    1
    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:
    http://www.Domain.de/?refid=XYZ&amp;b_id=250
    durch den Check durch.

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

  8. #8
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    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 filter_var (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.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51