Engin: Ein Selfhtml Artikel ohne Datum, abfrage zur Aktualität.

Nabend,

hab mir gerade diesen Artikel "Formularvalidierung mit regulären Ausdrücken"
angesehen und würde gern wissen,
wie Aktuell die dort beschriebene Methode ist.

Da steht leider kein Datum zum erstellungs Zeitpunkt. Bug oder Absicht? Man weiss es nicht. :)

Grüße,
Engin
 GYRO

  1. Moin!

    hab mir gerade diesen Artikel "Formularvalidierung mit regulären Ausdrücken"
    angesehen und würde gern wissen,
    wie Aktuell die dort beschriebene Methode ist.

    Da steht leider kein Datum zum erstellungs Zeitpunkt. Bug oder Absicht? Man weiss es nicht. :)

    Der Quelltext sagt:

      
    <meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">  
    
    

    Dem würde ich erst einmal glauben. Und auch ein oberflächliches Artikelscannen hat keine argen Bösheiten auffinden lassen: Der PHP-Code kennt z.B. $_GET, die Problematik von magic_quotes_gpc, die Notwendigkeit des Escapings für Datenbanken mit mysql_real_escape_string() etc.

    Wenn du Fehler findest, darfst du sie trotzdem gerne melden: https://redaktion.selfhtml.org/newticket?component=SELFHTML aktuell :)

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi Sven, hi roland,

      Der Quelltext sagt:

      <meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">

      
      >   
      > Dem würde ich erst einmal glauben.  
        
      Da hätte ich auch selbst draufkommen können, liegt aber daran, das ich in  
      meinen Quelltexten sowas nicht benutze, sollte ich in Zukunft wohl machen.  
        
      
      > Wenn du Fehler findest, darfst du sie trotzdem gerne melden: <https://redaktion.selfhtml.org/newticket?component=SELFHTML%20aktuell> :)  
        
      O.k, werde das Formular benutzen, wenn ich gehackt werde meld ich mich. :)  
        
      Grüße aus H im R,  
      Engin  
      
      -- 
      ["ich bin ein Insekt, ich bin ein Insekt"](http://nimmet.de/nimmet-dateien/banjo.shtml)  
        
      ![](http://nimmet.de/nimmet-bilder/valigator.gif)[Der Valligator](http://old.atomic-eggs.com/old_forum/messages/237.html#a1)  
        
      ["I would like to buy a hamburger"](http://www.youtube.com/watch?v=x8S7x_z1w1s)
      
    2. Hi Sven,

      Wenn du Fehler findest, darfst du sie trotzdem gerne melden: https://redaktion.selfhtml.org/newticket?component=SELFHTML aktuell :)

      Da wollte ich jetzt drauf zurück kommen, aber weiss nicht, wie ich es dort melden soll, da mein anliegen irgendwie zu
      keinem der "Type:" passt, da fehlt dann "beschwerde". :)

      Hätte man bei diesem Script nicht einfaches verständliches PHP verwenden können?

      Ich wollte im Script Teil

        
      if ($form_send):  
        $errorlist = $errors == 0  
          ? '<h2>Vorschau, die Daten wurden noch nicht gespeichert!</h2>  
             <p>....</p>'
      

      die gefüllten Variablen aus den Formularen zur vorschau einbinden, aber ich versteh
      diese Art von PHP Code nicht. Wie schimpft sich die hier verwendete Methode?

      Laufen tut es jedenfalls schonmal.

      Grüße aus H im R,
      Engin

      1. Hi,

        Ich wollte im Script Teil

        if ($form_send):
          $errorlist = $errors == 0
            ? '<h2>Vorschau, die Daten wurden noch nicht gespeichert!</h2>
               <p>....</p>'

        
        >   
        > die gefüllten Variablen aus den Formularen zur vorschau einbinden, aber ich versteh  
        > diese Art von PHP Code nicht. Wie schimpft sich die hier verwendete Methode?  
          
        Das erste ist eine [alternative Schreibeweise fuer If](http://www.php.net/manual/en/control-structures.alternative-syntax.php) - statt den Anweisungsblock, den du von einer Bedingung abhaengig machen moechtest, in geschweifte Klammern zu schreiben, kannst du auch  
        ~~~php
        if(bedingung):  
          // Anweisungen  
        endif;
        

        verwenden.

        Und das andere, worueber du hier gestolpert bist, ist der Ternary Operator - manchmal auf Deutsch auch als Trinitaets-Operator bezeichnet.
        Der stellt eine Art Kurzform einer If-Abfrage dar, in Form eines Ausdruckes - eignet sich insbesondere fuer Zuweisungen, wo du abhaengig von einer Bedingung einen bestimmten Wert und bei Nichtzutreffen einen anderen zuweisen willst.

        $a = ($b == 5) ? $c : $d;
        Wenn die Bedingung $b == 5 zutrifft, bekommt $a den Wert von $c zugewiesen, andernfalls den von $d.

        In der "langen" Schreibweise mit If saehe das so aus:

        if($b == 5) {  
          $a = $c;  
        }  
        else {  
          $a = $d;  
        }
        

        MfG ChrisB

        1. Hi ChrisB,

          Danke, das hab ich jetzt soweit verstanden, nur, wie kann ich in diesem Block

          if ($form_send):  
            $errorlist = $errors == 0  
              ? $vor_var = $values['interpret']  
              : '<h2>..</h2>';  
          endif;
          

          die Variable $vor_var mit dem Wert von $values['interpret'] füllen, ohne das
          ganze gleich auszugeben, da die Ausgabe an anderer Stelle passieren soll.

          Warum wird im obigen beispiel überhaupt irgendwas ausgegeben? Ich füll die Variable doch nur mit einem Wert.

          Grüße aus H im R,
          Engin

          1. Hi,

            if ($form_send):

            $errorlist = $errors == 0
                ? $vor_var = $values['interpret']
                : '<h2>..</h2>';
            endif;

            
            >   
            > Warum wird im obigen beispiel überhaupt irgendwas ausgegeben? Ich füll die Variable doch nur mit einem Wert.  
              
            Eben - da wird nix ausgegeben.  
            Wenn du eine Ausgabe hast, muss die woanders herkommen.  
              
            MfG ChrisB
            
            1. Hi ChrisB,

              Eben - da wird nix ausgegeben.
              Wenn du eine Ausgabe hast, muss die woanders herkommen.

              Ich weiss es nicht, hab mich jetzt die ganze Zeit nur auf das genannte stück Code
              fixiert gehabt, da änderungen nur dort bemerkbar wurden.

              Das gesamte Script ist so unübersichtlich und schwer zu Handhaben, an sich funktioniert es ja, nur Vorschau
              sollte auch Vorschau sein.

              Ich versteh garnicht, für wem das Script sein soll, für anfänger die es lernen wollen (ungeeignet) oder
              fortgeschrittene, die es eh können.

              http://nimmet.de/phpistest/eintragtest.txt

              Grüße aus H im R,
              Engin

          2. Lieber Engin,

            if ($form_send):

            $errorlist = $errors == 0
                ? $vor_var = $values['interpret']
                : '<h2>..</h2>';
            endif;

              
            Du meinst wohl eher soetwas?  
              
            ~~~php
            if ($form_send) {  
                $vor_var = ($errors == 0) ? $values['interpret'] : $values['fehlermeldung'];  
            }
            

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hi Felix,

              Du meinst wohl eher soetwas?

              if ($form_send) {

              $vor_var = ($errors == 0) ? $values['interpret'] : $values['fehlermeldung'];
              }

                
              Ja, so soll es sein, vielen Dank!  
              Da mogelt sich in der Vorschau noch irgendwo her eine "1" in die Seite,  
              damit kann ich aber leben. :) Wahrscheinlich irgendein Array indiz.  
                
              Hab´s für mich ein wenig ändern müssen, da ich mir da irgendwas zusammen abstrahiert hab,  
              aber es lebt.  
                
              ~~~php
                
              $errorlist = '';  
                
              if ($form_send) {  
                  $vor_var = ($errorlist = $errors == 0) ? $values['interpret'].'<br />'.$values['album'] :  '<h2>Einige Formulareingaben sind unvollständig oder  
                     fehlerhaft</h2><ul><li>'.  
                     join('</li><li>', array_filter($messages)).  
                     '</li></ul>';  
              }  
              else {  
              $vor_var = '';  
              }
              

              Dann kann ich Heute ja doch noch ruhig schlafen. :) Werde Heute Abend noch die HTML ausgabe überarbeiten.

              Gute Nacht und viele Grüße aus H im R,
              Engin

              1. Hi,

                Da mogelt sich in der Vorschau noch irgendwo her eine "1" in die Seite,
                damit kann ich aber leben. :) Wahrscheinlich irgendein Array indiz.

                Nein, vermutlich eher ein Funktionsaufruf, der true als Rueckgabewert zurueckgibt - den du dann unnoetigerweise per echo ausgibst, was true zu 1 konvertiert.

                MfG ChrisB

                1. Hi ChrisB,

                  Nein, vermutlich eher ein Funktionsaufruf, der true als Rueckgabewert zurueckgibt - den du dann unnoetigerweise per echo ausgibst, was true zu 1 konvertiert.

                  Stimmt, jetzt ist es Fertig. :) Da war noch die Variable $errorlist im  <<< EOT, daher hatte ich
                  es übersehen.

                  Da kann man ja an die Tests,
                  Sinnlose Einträge zu testzwecken und überlastung meiner Server erwünscht,
                  falls sich hier der ein oder andere hacker Tummelt, so ist er herzlichst eingeladen, mich zu hacken. :))

                  Grüße aus H im R,
                  Engin

  2. "Formularvalidierung mit regulären Ausdrücken"
    Da steht leider kein Datum zum erstellungs Zeitpunkt.

    Use The Source, Luke:

    <meta name="DC.Date"        content="2005-04-02T13:35+01:00">  
    <meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">  
    <meta name="SELF.Version"   content="1">
    

    Roland

  3. Hi Engin,

    jaa, schon wieder ich, schon wieder usereingaben. *g

    Bastel grad an einem Login mit registrierung, diese Daten kommen in die DB, die muss
    ich wohl auch mit mysql_real_escape_string übergeben oder? Hab ein Tut dazu gefunden, wo es ohne gemacht wird,
    ich mach es einfach mit.

    Aber wie ist das beim fertigen Login, wenn der User seine Daten hat und sich einloggen will,
    da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten? Wenn ja, mit was?
    Bzw. Passwort wird mittels md5 übergeben, also man sieht nur Sterne, aber der Benutzername.

    Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
    gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?

    <form action="searchdetails.php?" method="GET">  
            <input type="radio" name="suche_in" value="Interpret">Interpret  
            <input type="radio" name="suche_in" value="Album">Album  
            <input type="radio" name="suche_in" value="Titel">Titel  
    <input type="text" name="suche" size="20" value=""> Suche  
    
    
      
    if (($_GET['suche_in']) && ($_GET['suche'])){  
      
      $sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";  
      
     $ergebnis = mysql_query($sql);  
      while($row = mysql_fetch_object($ergebnis))  
        {  
        echo (htmlspecialchars($row->$suche_in));  
        echo '<a  href="details.php?id=';  
        echo (htmlspecialchars($row->id));  
        echo '>';  
        echo (htmlspecialchars($row->Titel));  
        echo '</a>';  
             }  
       }  
    else {  
    echo 'keine treffer';  
      }
    

    Und hier funktioniert das Else nicht, also wenn es keine treffer gibt bekomme ich die else nicht angezeigt,
    wo liegt hier der fehler?

    Auf meiner suche habe ich diesen interessanten Artikel gefunden, vielleicht hilft es ja wem.

    Grüße aus H im R,
    Engin

    1. Hi,

      Bastel grad an einem Login mit registrierung, diese Daten kommen in die DB, die muss
      ich wohl auch mit mysql_real_escape_string übergeben oder?

      Zum x-ten Mal: Wenn du Daten in einen bestimmten Kontext ueberfuehrst, dann *musst* du die Daten diesem Kontext entsprechend behandeln.

      Ob du einen Usernamen, ein Passwort, die Fellfarbe deines Hundes, oder die Todesanzeige von Oma in den Kontext MySQL ueberfuehrst - scheissegal. *Alle* erfordern natuerlich die entsprechende Behandlung.

      Hab ein Tut dazu gefunden, wo es ohne gemacht wird,
      ich mach es einfach mit.

      A) Man findet viel Mist im Netz.
      B) Da du ja herkommst, um dazuzulernen, kannst du dir deine eigenen Gedanken zu dem Mist, den du findest, machen, und ihn entsprechend einordnen.

      Aber wie ist das beim fertigen Login, wenn der User seine Daten hat und sich einloggen will,
      da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten?

      Ja natuerlich - was hammer den oben gerade gesagt, hm?

      Wenn ja, mit was?

      Na mit was wohl? Dem ueblichen.

      Bzw. Passwort wird mittels md5 übergeben, also man sieht nur Sterne, aber der Benutzername.

      Die Sterne siehst du nicht, weil das Passwort mit MD5 gehasht wird, sondern weil das input-Feld vom type password ist.

      Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
      gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?

      Siehe oben ...!

      if (($_GET['suche_in']) && ($_GET['suche'])){

      $sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";

      $ergebnis = mysql_query($sql);
        while($row = mysql_fetch_object($ergebnis))
          {
          echo (htmlspecialchars($row->$suche_in));
          echo '<a  href="details.php?id=';
          echo (htmlspecialchars($row->id));
          echo '>';
          echo (htmlspecialchars($row->Titel));
          echo '</a>';
               }
         }
      else {
      echo 'keine treffer';
        }

      
      >   
      > Und hier funktioniert das Else nicht, also wenn es keine treffer gibt bekomme ich die else nicht angezeigt,  
      > wo liegt hier der fehler?  
        
      Das else interessiert sich ueberhaupt nicht dafuer, ob du von der DB Ergebnisse bekommst oder nicht.  
      Es ist das Gegenstueck zum if - und nimmt das etwa Bezug darauf, ob und was die Datenbank liefert? Noe, nicht im Geringsten.  
        
      MfG ChrisB
      
      1. Hi ChrisB,

        die Fellfarbe deines Hundes, oder die Todesanzeige von Oma in den Kontext MySQL ueberfuehrst - scheissegal. *Alle* erfordern natuerlich die entsprechende Behandlung.

        <ich abe gar keine Hund> :) Aber stimmt, hast natürlich Recht, werde einfach mein
        eintrags Formular, das ich habe auch für die Registrierung umbauen/benutzen, das überprüft ja alle Eingaben.

        A) Man findet viel Mist im Netz.
        B) Da du ja herkommst, um dazuzulernen, kannst du dir deine eigenen Gedanken zu dem Mist, den du findest, machen, und ihn entsprechend einordnen.

        Stimmt, ich habe bis jetzt schon viel Mist gefunden, nur als Grundlage kann man das
        ein oder andere ja benutzen. Und durch erweiterungen der gefundenen Dinge kann man ja
        auch schritt für schritt lernen.

        da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten?
        Wenn ja, mit was?
        Na mit was wohl? Dem ueblichen.

        mysql_real_escape_string? Beim Login?

        gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?
        Siehe oben ...!

        Das Login und die suche sind doch auf GET Basis, gut, die variablen, "wo" in der Datenbank
        gesucht werden soll, werde ich in ein Array packen, so wie von Sven vorgeschlagen,
        aber die eingabe im Textfeld, muss ich die noch irgendwie bearbeiten.

        Denn ich denke mir das so, wenn ich eine suchanfrage mache und die ergebnisse bekomme, steht in der Adresszeile ja z.b.

        ergebnis.php?suche_in=Interpret&suche=ko

        hier könnte man doch auch reinschreiben, was man will.

        Und hier funktioniert das Else nicht,
        Das else interessiert sich ueberhaupt nicht dafuer, ob du von der DB Ergebnisse bekommst oder nicht.
        Es ist das Gegenstueck zum if - und nimmt das etwa Bezug darauf, ob und was die Datenbank liefert? Noe, nicht im Geringsten.

        Da muss ich die egebnisse erst auf true/false testen oder?

        Grüße aus H im R,
        Engin

    2. Moin!

      Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
      gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?

      Aber auf jeden Fall!

      Alles, was im endgültigen SQL-Query dynamisch hineinkommt, muß behandelt werden!

      Dummerweise nicht alles gleich.

      Das Syntaxhighlighting zeigt im String ja die beiden Variablen schön deutlich an. Und wo Variablen in SQL reinkommen, droht Gefahr.

        
        $sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";  
      
      

      Dummerweise hast du hier nun ausgerechnet zwei Spezialsonderfälle ausgegraben, bei denen dir mysql_real_escape_string() beidesmal nicht exakt helfen kann.

      Beginnen wir mit $suche_in. Der Variableninhalt ist eine in der Tabelle existierende Spalte, die durchsucht werden soll.

      Den Spaltennamen mit mysql_real_escape_string() zu escapen hilft absolut nicht, weil diese Funktion nur dafür vorgesehen ist, "Daten" innerhalb von einfachen 'Anführungszeichen' zu escapen.

      Wenn du die Spaltennamen flexibel haben willst, mußt du anders vorgehen: Ein im Programmcode definiertes Array enthält alle erlaubten, gültigen Spaltennamen, und dein Radiobutton wählt aus diesem Array über den Index nur noch eine der erlaubten Namen aus. Auf diese Weise wird verhindert, dass
      a) der Angreifer sich beliebige (auch nichtexistierende) Spaltennamen ausdenken kann (er kann das Formular ja beliebig verändern und dir Blödsinn schicken),
      b) der Angreifer bösen SQL-Code in dein Query reinkriegt.

      Abgesehen davon wird dein Code dadurch ein Tickchen flexibler, weil die Bezeichner im HTML-Formular nicht mehr mit den Bezeichnern der DB-Spalte übereinstimmen müssen, sondern durch das Array ineinander konvertiert werden.

      Das zweite Problem bildet die Variable $suche. Im Prinzip hilft dir mysql_real_escape_string() hier schon, weil es sich, wie auch in allen anderen Anwendungsfällen, um einen String innerhalb von einfachen Anführungszeichen dreht.

      Allerdings gibt es hier einen kleinen Unterschied: Du nutzt die Suchfunktion mit LIKE, und das sorgt dafür, dass zwei Zeichen plötzlich Sonderbedeutung erhalten: '%' und '_'. Diese beiden Zeichen sind normal nichts ungewöhnliches und werden daher auch nicht escaped. Müssen sie auch nicht. Aber was ist, wenn der Benutzer in der Datenbank einen Begriff sucht, der ein Prozentzeichen oder einen Unterstrich enthält - aber damit nicht das LIKE-Platzhalterzeichen gemeint ist, sondern ein real in der Datenbank gespeichertes Prozent oder Unterstrich?

      Du mußt dich an dieser Stelle also entscheiden, was du willst (Suchen sind hinsichtlich der "korrekten Suchergebnisse" ja durchaus Auslegungssache): Gibt der Benutzer einen String ein, der exakt so gefunden werden soll, oder soll die Nutzung von Datenbank-Wildcardzeichen für die Suche erlaubt sein? Und wäre es in so einem Fall nicht schlauer, wenn man die typischeren Zeichen wie "*" dafür einsetzen würde?

      Das Escaping für Wildcardzeichen in MySQL ist jedenfalls relativ simpel: Backslashes sind der Standard, man kann aber im Prinzip jedes beliebige Zeichen verwenden, wenn man es im Query angibt.

      Allerdings ist die Backslashverdopplung zu beachten, denn bereits im String enthaltene Backslashes müssen natürlich nochmal escaped werden, damit sie als tatsächliches Zeichen "durchkommen", und nicht zwischendurch als Escape-Zeichen eliminiert werden. Das gilt auch für die durch mysql_real_escape_string() eingeführten Backslashes.

      Siehe auch http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hi Sven,

        erstmal Danke für deine ausführliche Antwort.

        Wenn du die Spaltennamen flexibel haben willst, mußt du anders vorgehen: Ein im Programmcode definiertes Array enthält alle erlaubten, gültigen Spaltennamen, und dein Radiobutton wählt aus diesem Array über den Index nur noch eine der erlaubten Namen aus.

        Das ist schonmal ein guter Vorschlag, wie gesagt, meine suche war nur provisorisch.
        Ich wollte erstmal ein Paar erfolgserlebnisse, jetzt mach ich mich ans aufräumen.

        Du mußt dich an dieser Stelle also entscheiden, was du willst (Suchen sind hinsichtlich der "korrekten Suchergebnisse" ja durchaus Auslegungssache): Gibt der Benutzer einen String ein, der exakt so gefunden werden soll, oder soll die Nutzung von Datenbank-Wildcardzeichen für die Suche erlaubt sein?

        Mit Wildcardzeichen ist doch gemeint, das auch "ähnliche" Worte wie der eigentliche
        suchbegriff gefunden werden oder hab ich das falsch verstanden.
        Das wäre natürlich nützlich, wenn die suchfunktion Flexibel ist, nur zeichen wie % oder _ hätten für
        mein Projekt keine relevanz in den suchergebnissen.
        Wobei ich in der Richtung noch viel vor mir hab, muss mich auch noch mit Joins
        auseinandersetzen, so wie ich an anderer stelle erfahren hab.

        Dann mach ich mich mal wieder an die arbeit.

        Grüße aus H im R,
        Engin