Ankündigung

Einklappen
Keine Ankündigung bisher.

101: Alles regulär

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 101: Alles regulär

    5:
    Dauerstress im Hause Nikolaus. Tausende Pantoffeln, Stiefel und Sandaletten wollen bis zum Morgen gefüllt sein. „Wenigstens muss ich keine Schuhe putzen“, denkt sich der fleißige Geselle.
    Aber trotzdem hätte es letztes Jahr fast einen Super-GAU gegeben, weil die Liste mit Naschwerk und Adressen wiedermal in einer echten Sauklaue verfasst war.

    „Dieses Jahr wird alles besser“, schwört sich Nik'laus und setzt auf Technik. Er richtet ein paar Webformulare ein und hat — schwuppdiwupp — alles in einer Datenbank. Damit ihn nicht der listige Fehlerteufel noch um den frühen Feierabend bringt, hat er dabei pflichtbewusst einige Validierungen benutzt. 10 der Wichtigsten könnt Ihr hier aus dem elektronischen Stiefel fischen:

    PHP-Code:
    // Anmerkung: Die Validierungen sind für Request-Parameterdaten gedacht. 
    // Daher schieden typechte Validerungsformen, bspw. für INT-Werte, aus.
    // Und - ja, wie immer führen viele Wege zum Ziel.

    // Nicht-Null, 0 erlaubt
    function validate_NN ($value)
      {
      return (
    false === empty ($value) || '0' === $value);
      }


    // Nicht-Null, 0 nicht erlaubt
    function validate_NN_int ($value)
      {
      return (
    false === empty ($value));
      }


    // Ganzzahlwert
    function validate_int ($value)
      {
      return (
    is_numeric ($value) && 
              (string) (int) 
    $value === (string) $value);
      }


    // Formal gültiges deutsches Datum 
    function validate_date ($value)
      {
      list (
    $day $month $year) = preg_split ('#[\./-]\s*#' $value 3);
      if (
    false === is_numeric ($day)   || 
          
    false === is_numeric ($month) ||
          
    false === is_numeric ($year)  ||
          
    $day   != (int) $day          ||
          
    $month != (int) $month        ||
          
    $year  != (int) $year            ) {
        return (
    false);
        }

      return (
    checkdate ($month $day $year));
      }


    // Alter aus Geburtsdatum 18-100
    function validate_age ($value)
      {
      list (
    $day $month $year) = preg_split ('#[\./-]\s*#' $value 3);

      
    // check formal
      
    if (false === is_numeric ($day)   || 
          
    false === is_numeric ($month) ||
          
    false === is_numeric ($year)  ||
          
    $day   != (int) $day          ||
          
    $month != (int) $month        ||
          
    $year  != (int) $year            ) {
        return (
    false);
        }

      
    // check range
      
    $timestamp mktime ($month $day $year);
      return (
    strtotime ('- 18years') > $timestamp && 
              
    strtotime ('- 100years') < $timestamp);
      }


    // Datum ohne Umlaute
    function validate_alpha ($value)
      {
      return (
    === preg_match ('#[^a-z]#i' $value));
      }


    // Telefonnummer, einfach
    function validate_phone ($value)
      {
      
    $minlength 3;
      
      if (
    preg_match ('#[^0-9\+\-\040/]#' $value)) {
        return (
    false);
        }
      return (
    strlen (trim ($value)) >= $minlength);
      }


    // Einfache Email
    function validate_email ($value)
      {
      return (
    === preg_match ('#^\w+(?:[\.\-]\w+)*?@\w{3,}(?:[\-_]\w+)*?\.\w{2,5}(?:\.\w{2,5})?$#' $value));
      }


    // Einfache URL
    function validate_url ($value)
      {
      return (
    === preg_match ('#[ÖÜÄöüäß\s]#' $mValue) &&
              
    === preg_match ('#^https?://(?:\w{2,}(?:[\-_]\w+)*\.)+\w{2,5}(?:\.\w{2,5})?(?:[\?\#/][^\s]*)?$#' $value));
      }


    // Deutsche PLZ
    function validate_zip ($value)
      {
      
    $value ltrim ($value ' 0');
      if (
    false === is_numeric ($value) && (string) (int) $value === (string) $value) {
        return (
    false); 
        }
      return (
    999 < (int) $value && (int) $value 100000);
      }

    // Der Nikolaus übernimmt keine Gewähr für die Richtigkeit und empfiehlt einen
    // ausgiebigen Testprozess vor jeglicher Nutzung in Produktivsystemen! 


  • #2
    Data Filtering Using PHP's Filter Functions - Part one - Devolio
    "Nobody is as smart as everybody" - Kevin Kelly
    — The best things in life aren't things

    Kommentar


    • #3
      Der Einwand mußte natürlich kommen. Beachte: Filtern ist nicht Validieren! In den Linkbeispielen ist die Anwendung aber dafür richtig.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Der Einwand mußte natürlich kommen.
        Exakt!
        Filtern ist nicht Validieren!
        Wenn man sich um den jeweiligen Filter eine Funktion schreibt und darin return false/true; einbaut, dann ist es wieder Validieren, stimmt.

        PECL beats preg_match in performance anyway. Ich wollte dem geneigten Leser nur eine weitere Perspektive aufzeigen. Mehr nicht.

        PS:
        PHP-Code:
        // Nicht-Null, 0 erlaubt 
        function validate_NN ($value) {}

        // Nicht-Null, 0 nicht erlaubt 
        function validate_NN_int ($value) {} 
        Wenn Null erlaubt ist, kann die 1. Funktion einfach *_empty() heißen.
        Prüft validate_NN_int() tatsächlich auf einen Integer?
        "Nobody is as smart as everybody" - Kevin Kelly
        — The best things in life aren't things

        Kommentar


        • #5
          Wenn Null erlaubt ist, kann die 1. Funktion einfach *_empty() heißen.
          seh ich nicht so: 0 ist eben nicht "empty",
          wenn die PHP-Funktion empty das auch anders sehen mag.

          Nur if(isset($var) && $var == '') ist wirklich empty.
          Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

          Kommentar


          • #6
            Zitat von Koala Beitrag anzeigen
            seh ich nicht so: 0 ist eben nicht "empty",
            wenn die PHP-Funktion empty das auch anders sehen mag.

            Nur if(isset($var) && $var == '') ist wirklich empty.
            Prüft validate_NN_int() tatsächlich auf einen Integer?
            Das bezweifle ich auch.
            Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

            Kommentar


            • #7
              @Koala:
              Ich wollte sagen, dass die Funktion ruhig nach dem benannt werden kann was sie tut.
              PHP-Code:
              // Nicht-Null, 0 nicht erlaubt 
              function validate_NN_int ($value
                { 
                return (
              false === empty ($value)); 
                } 
              .. nämlich auf empty prüfen.
              Nur if(isset($var) && $var == '') ist wirklich empty.
              Stimmt. Es gab auch noch eine andere Lösung, die fällt mir aber gerade nicht ein.
              "Nobody is as smart as everybody" - Kevin Kelly
              — The best things in life aren't things

              Kommentar


              • #8
                Sie prüft das was drüber steht: // Nicht-Null, 0 nicht erlaubt
                Allenfalls stört Euch der Bezeichner.

                Nur if(isset($var) && $var == '') ist wirklich empty.
                Nur im konkreten Anwendungsfall Validierung von Request-Parameterdaten. Sonst ist nämlich FALSE und (int) 0 auch == ''. Besser === verwenden.

                Siehe auch: PHP type comparison tables
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Nachtrag: Weil ich da gerade was zu gelesen habe. Je nach Answendungsfall kann es sinnvoll sein, die ersten beiden Funktionen noch durch ein trim zu ergänzen. Leerzeichen als nicht-leere Einträge sind selten erwünscht.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Nachtrag: Weil ich da gerade was zu gelesen habe. Je nach Answendungsfall kann es sinnvoll sein, die ersten beiden Funktionen noch durch ein trim zu ergänzen. Leerzeichen als nicht-leere Einträge sind selten erwünscht.
                    Es ist immer sinnvoll. Ich mache es aus prinzip immer und dann kommt erst die Validdierung ... ein Leerzeichen hat man schnell zuviel getippt.
                    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                    Kommentar


                    • #11
                      Ich auch. Erst Filterung und danach Validierung der gefilterten Daten.
                      Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                      Kommentar


                      • #12
                        Wenn Filterung trim heißt bin ich einverstanden. Ansonsten habe ich im Wiki unter Validierung geschrieben, dass die Reihenfolge abhängig von der Aktion ist, die auf eine fehlerhafte Validierung folgt.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Filterung heißt in diesem Fall Aufbereitung der Daten zu einem einheitlichen Format.
                          Das kann einschließen:

                          - Entfernen führender und schließender Leerzeichen
                          - Korrigieren des Zeichensatzes
                          - Standardisieren der Zeilenumbruchssequenzen

                          uvm. Also alles, was einem die Validierung erleichtert, ohne dabei die Daten selbst großartig zu verändern.
                          Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                          Kommentar


                          • #14
                            Wie im Wiki geschrieben kann Validierung auch zum Erkennen von Angriffen dienen (bspw. Erkennen, ob das Formular benutzt wurde). Dann ist Filter vorher keine gute Idee.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              Ich weiß, eben deshalb sollte der Filter die Daten so wenig wie möglich verändern. Ein Abbruch ist auch immer besser als ein Hinbiegen der Daten, aber eine gewisse Filterung kann schon ganz praktisch sein, wobei Filterung vielleicht nicht das richtige Wort ist. Aufbereitung trifft es eher.
                              Wichtig ist, dass nichts verändert wird, was relevant sein könnte. Aber da alles relevant sein könnte, kann man es auch sein lassen. Allerdings wird die Validierung dann oft wieder etwas aufwendiger. Dort sollte man also einen Kompromiss finden.
                              Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                              Kommentar

                              Lädt...
                              X