Warum wird hier htmlentities eingesetzt?

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

  • Warum wird hier htmlentities eingesetzt?

    Hallo,

    Ich bin mir leider nicht sicher warum unter folgenden Bedingungen
    htmlentities eingesetzt wird.

    Ausgang:
    Ich versuche einen Formmailer Schritt für Schritt aufzubauen.
    Obwohl es viele fertige und auch anpassbare Formmailer gibt möchte
    ich dies aus folgenden Gründen tun:
    1. Ich bin dabei mich in PHP einzuarbeiten, es zu lernen.
    2. Wirklich gute Formmailer lassen sich nur dann entsprechend anpassen
    und umsetzten wenn man versteht was man tut.
    3. Einfache Formmailer lassen sich nicht entsprechend anpassen
    4. Ich finde ein Formmailer ist eine gute Möglichkeit sich in PHP
    einzuarbeiten, da er sich eben Schritt für Schritt aufbauen läßt und die
    Möglichkeit bietet jeden Schritt in ein eigenes Script zu packen und dabei
    doch nicht zu unübersichtlich wird.

    Wie bei Anfängern üblich stieß ich ziemlich früh auf die 1. Probleme und konnte sie mit Forumshilfe überwinden.
    Wobei der Formmailer noch lange nicht fertig ist und sicher noch der ein oder andere kommt.

    Jetzt habe ich momentan z.B. so ein "Hä, warum denn das?" Problem.

    Zur Verdeutlichung das Ausgangsscript:
    PHP-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

        <head>
            <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
            <title>Formularausgabe</title>
        </head>

        <body bgcolor="#000000">
            <p><font size="+3" color="#4b9e96"><strong>Kontaktformular </strong></font></p>
            <p><font size="+2" color="#4b9e96"><strong>Ihre Mail: </strong></font></p>
            
            <?php

    $sent 
    = isset($_POST['sent']) ? $_POST['sent'] : '';
    $eMail = isset($_POST['eMail']) ? $_POST['eMail'] : '';
    $vorname = isset($_POST['vorname']) ? $_POST['vorname'] : '';
    $nachname = isset($_POST['nachname']) ? $_POST['nachname'] : '';
    $betreff = isset($_POST['betreff']) ? $_POST['betreff'] : '';
    $nachricht = isset($_POST['nachricht']) ? $_POST['nachricht'] : '';
    if (
    $sent and $eMail)
    {
       global 
    $eMail$vorname$nachname$betreff$nachricht;
       
       echo 
    "<br><p><font color = 4b9eff size = +1 <b>Gesendet am:</b><br>";
        
    $Datum date('D, d.m.Y');
          
    $Uhrzeit date('H:i:s');
       echo 
    "$Datum  <br>";
       echo 
    "$Uhrzeit  <br><p>";
       echo 
    "Von:<b> {$_POST['vorname']} </b>";
       echo 
    "<b>{$_POST['nachname']}</b><br><p>"
       echo 
    "Absender: <b>{$_POST['eMail']}</b><br><p>";
       echo 
    "<b>Betreff: </b>{$_POST['betreff']}<br><p>";
       echo 
    "<b>Ihre Nachricht:</b><br><p>";
       echo 
    "{$_POST['nachricht']}</font>";     

        include (
    "send.inc.php");
      } 

    else {
       echo 
    "Eingabe fehlt";
    }   
    ?>
    und hier das von H2O überarbeitet Script:
    PHP-Code:
    <?php
    foreach($_POST as $key => $val){
        $
    $key htmlentities($val);
    }

    if (!empty(
    $sent) and !empty($eMail))

       
    printf("<font color='#4b9eff' size='+1'><b>Gesendet am:</b><br />\n%s<br />%s<br />Von:<b>%s %s</b><br />
               Absender: <b>%s</b><br />\n<b>Betreff: %s</b><br />\n<b>Ihre Nachricht: </b><br />%s</font><br />\n"
    ,    
              
    date('D, d.m.Y'),
              
    date('H:i:s'),
              
    $vorname,
              
    $nachname,
              
    $eMail,
              
    $betreff,
              
    $nachricht);
       
       include (
    "send.inc.php");

    else {
       echo 
    "Eingabe fehlt";

    ?>
    Fast alles kann ich nachvollziehen, nur bei:
    PHP-Code:
    foreach($_POST as $key => $val){
        $
    $key htmlentities($val); 
    bin ich mir nicht sicher.

    Die foreach Schleife verstehe ich noch, nur bei
    PHP-Code:
    $$key htmlentities($val); 
    stehe ich auf dem Schlauch.

    Unklarheit:

    Warum wird hier htmlentities verwendet?

    Mein Problem hierbei ist nun folgendes:
    Laut Manual wandelt htmlentities alle geeigeneten Zeichen in HTML-Code um.
    html_entity_decode konvertiert alle html-Zeichen in ihren Uhrsprungscode.

    Soweit das Manual.

    Wenn ich nun
    PHP-Code:
    foreach($_POST as $key => $val){
        $
    $key $val
    auf folgende Eingabe:
    "was ergibt das <b>wohl</b> Günter?"
    anwende, erhalte ich als Ausgabe:
    was ergibt das wohl Günter?
    genau das selbe wie mit
    PHP-Code:
    foreach($_POST as $key => $val){
        $
    $key html_entity_decode($val); 
    nur bei
    PHP-Code:
    foreach($_POST as $key => $val){
        $
    $key htmlentities($val); 
    gibt er mir
    was ergibt das <b>wohl</b> Günter?
    aus.

    Die korrekte Darstellung von ü, ä, ö zu erreichen ist einfach, in ändere im
    HTML-Kopf der Seite das Charset von Iso-8859-1 auf UTF-8 und das
    Problem "Günter" ist erledigt.

    Wende ich nun htmlentities an, erhalte ich die selbe Ausgabe wie unter ISO-8859-1.
    Ich möchte aber ä, ö,ü korrekt dargestellt haben.
    das heißt ich muss zur korrekten Ausgabe von ä, ö, ü, €, usw
    PHP-Code:
      $$key htmlentities($valENT_COMPAT'UTF-8'); 
    anwenden, und erhalte damit:
    was ergibt das <b>wohl</b> Günter?
    Wird html_entity_decode verwendet ist die Ausgabe identisch mit $$key = $val.

    Fazit:

    Die Wirkungsweise und die Funktion scheine ich verstanden zu haben, aber
    leider scheint mir der Grund für den Einsatz von htmlentities verborgen zu bleiben.

    Kann mir bitte jemand sagen weshalb hier htmlentities angewand wird?
    Ist htmletinities vielleicht eine notwendigkeit dafür wenn der Formmailer später abgesichert werden soll?

    Momentan bin ich nämlich erst dabei meine Eingabefelder auf irgendeinen Inhalt hin zu überprüfen und noch nicht bei der Inhaltsprüfung.

    Gruß

    Martin
    Greets

    Martin

    absolut beginner
    aber lernwillig

  • #2
    Kann mir bitte jemand sagen weshalb hier htmlentities angewand wird?
    Weil H2O wohl nicht daran gedacht hat, dass du den HTML Code tatsächlich anzeigen willst.
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      Original geschrieben von tontechniker
      Weil H2O wohl nicht daran gedacht hat, dass du den HTML Code tatsächlich anzeigen willst.
      Ok, das währe eine Möglichkeit, die ich ehrlich gesagt nicht bedacht habe.

      Ich poste mal kurz die send.inc.php5:
      (Endung php5, da mein Provider der Testdomain die Endung php noch über PhP 4 phrased)
      PHP-Code:
      <?php

      // send.inc.php

      echo "send.inc.php beginnt<br>";

       if(
      stripos($eMail'bcc:')){    // Minimale Kontrolle
          
      die("Ung&uuml;ltige Absenderadresse, Mail nicht verschickt<br />"); 
      }
      echo 
      "nach stripos <br>";

      $absender "absender@meinedomain.tld" ;
      $empfaenger "empfänger@meinedomain.tld" ;
      $nachricht2 sprintf("<b>Gesendet am: </b>%s<br /><b>um: </b>%s<br /><b>von: </b>%s %s<br />
                               <b>E-Mailadresse: </b>%s<br /><b>Betreff: </b>%s<br /><b>Nachricht: </b><br>%s"
      ,
                          
      date('D, d.m.Y'),
                          
      date('H:i:s'),
                          
      $vorname,
                          
      $nachname,
                          
      $eMail,
                          
      $betreff,
                          
      $nachricht);
      echo 
      "Headers<br>";

      $headers  'From:' $absender "\r\n" ;
      $headers .= 'Reply-To:' $eMail "\r\n" 
      $headers .= 'X-Mailer: PHP/' phpversion() . "\r\n" 
      $headers .= 'X-Sender-IP: ' $_SERVER['REMOTE_ADDR'] . "\r\n" 
      $headers .= "Content-type: text/html \r\n" ;

      echo 
      "vor Versand<br>";

      echo 
      "$empfaenger<br /> $betreff<br /> $nachricht2<br />  $headers<br />";
      mail($empfaenger$betreff$nachricht2,  $headers) ;

      echo 
      "Versandt" ;

      ?>
      Wie du siehst, habe ich obige Probleme dann in der Mail, aber das teste ich mal durch (bisher lief nur die Ausgabe, welche mir als Kontrolle und zum Verständnis dienen soll).

      Edit:
      Na klasse!
      Eigentlich hatte ich damit gerechnet, daß meine Mail der Browserausgabe entspricht. Aber, wies der Teufel will, dem ist nicht so.
      Und was mir dabei Kopfzerbrechen bereitet ist der Betreff.

      Als Betreff ($betreff) gab ich
      ÜÜÜ
      ein.
      Die Browserausgabe gibt
      ÜÜÜ
      aus, ebenso die Kontrollabfrage.
      In der Mail, im Header, hab ich als Betreff aber
      &Uxml;&Uxml;&Uxml; "x"steht für u, sonst gibt mir das Forum wieder ÜÜÜ aus
      stehen.
      In der Mail selber wiederum korrekterweise
      ÜÜÜ


      Ohoh, ich hab noch viel Arbeit vor mir

      Gruß

      Martin
      Zuletzt geändert von brmartin; 05.11.2007, 01:01.
      Greets

      Martin

      absolut beginner
      aber lernwillig

      Kommentar


      • #4
        Re: Warum wird hier htmlentities eingesetzt?

        PHP-Code:
        <?php
        foreach($_POST as $key => $val){
            $
        $key htmlentities($val);
        }
        Sowas solltest du dir gar nicht erst angewöhnen. Damit mimst du register_globals nach. Und weiter unten wird einfach auf die Variablen zugegriffen, egal, ob diese vorhanden sind oder nicht!
        Schon alleine $$key ist ganz ganz schlechter Stil!
        Da ist deine Lösung über
        PHP-Code:
        $sent = isset($_POST['sent']) ? $_POST['sent'] : ''
        um einiges eleganter!

        Kommentar


        • #5
          1.) Erst schreibst du die POST-Werte in eigene Variablen, gibst aber dann doch wieder die POST-Werte aus? Du kannst ja ruhig mit den POST-Werten weiterarbeiten, dann brauchst du sie aber nicht erst in eigene Variablen zu übernehmen.
          2.) Wieso machst du deine erstellten Variablen global?
          3.) htmlentities wird erst bei der Ausgabe angewendet, nicht zum Weiterverarbeiten. Mach einfach bei der Ausgabe
          PHP-Code:
          echo("Ihre Nachricht: " htmlentities($_POST['nachricht'])); 
          , dann hat es sich.
          4.) htmlspecialchars sollten eigentlich reichen.
          ich glaube

          Kommentar


          • #6
            Original geschrieben von ministry
            2.) Wieso machst du deine erstellten Variablen global?
            Das ist noch ein Überbleibsel und kommt nur im geposteten
            Uhrsprungscode vor, da ich dachte die Variablen werden nich an
            php.inc.send übergeben. Leider kann ich den damiligen Fehler im Code
            nichtmehr nachvollziehen, die Zeile global kann ersatzlos gestrichen
            werden, ich habe diesen Entwurf aber noch mit dieser Zeile gespeichert.

            Original geschrieben von PHP Desaster
            PHP-Code:
            <?php
            foreach($_POST as $key => $val){
                $
            $key htmlentities($val);
            }
            Sowas solltest du dir gar nicht erst angewöhnen. Damit mimst du
            register_globals nach. Und weiter unten wird einfach auf die Variablen
            zugegriffen, egal, ob diese vorhanden sind oder nicht!
            Schon alleine $$key ist ganz ganz schlechter Stil!
            Da ist deine Lösung über
            PHP-Code:
            $sent = isset($_POST['sent']) ? $_POST['sent'] : ''
            um einiges eleganter!
            Wieder was gelernt,
            wobei ich eigentlich die foreach-Schleife für eleganter hielt.
            Momentan sieht die send.php so aus:
            PHP-Code:
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

            <html>

                <head>
                    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
                    <meta name="Kontaktformular" content="Kontaktformular">
                    <title>Titel</title>
                </head>

                <body bgcolor="#cccccc">
                    <p><font size="+3" color="#4b9e96"><strong>Kontaktformular </strong></font></p>
                    <p><font size="+2" color="#4b9e96"><strong>Ihre Mail: </strong></font></p>
                    
                    
            <?php
            error_reporting 
            (E_ALL);
            //  send5.php5

            foreach($_POST as $key => $val){
                   $
            $key htmlentities($valENT_COMPAT'UTF-8');
            }


            if (empty(
            $vorname)) {
               echo 
            '<p><font size="+2" color="#4b9e96">
            <a href="javascript:history.back()"
            >Vorname fehlt! <br>Bitte hier klicken</a></font></p>'
            ;
            }

            elseif (empty(
            $eMail)) {
               echo 
            '<p><font size="+2" color="#4b9e96">
            <a href="javascript:history.back()"
            >Ihre E-Mailadresse fehlt!<br>Bitte hier klicken</a></font></p>'
            ;
            }

            elseif (empty(
            $betreff)) {
               echo 
            '<p><font size="+2" color="#4b9e96">
            <a href="javascript:history.back()"
            >Sie haben keinen Betreff angegeben!<br>Bitte hier klicken</a></font></p>'
            ;
            }

            elseif (empty(
            $nachricht)) {
               echo 
            '<p><font size="+2" color="#4b9e96">
            <a href="javascript:history.back()"
            >Sie haben keine Nachricht geschrieben!<br>Bitte hier klicken</a></font></p>'
            ;
            }
            else {

            $nachrichtumbruch wordwrap ($nachricht70"<br>");



            switch (
            $empfaenger)
              {
               case 
            1
                   
            $empfaenger "Empfänger1@meineDomain.tld";
                   break;

               case 
            2:
                   
            $empfaenger "Empfänger2@meineDomain.tld";
                   break;

               case 
            3:
                  
            $empfaenger "Empfänger3@meineDomain.tld";
                  break;

               case 
            4
                  
            $empfaenger "Empfänger4@meineDomain.tld";
                  break;

               default:
                  echo 
            "Fehler! kein Empfänger";
            }

             
            printf("<font color='#4b9eff' size='+1'><b>Gesendet am:</b><br />\n%s<br />%s<br /><p></<p>
                        <b>Von: </b>%s %s<br /><p></<p><b>Absender: </b>%s<br />\n<p></p>
                        <b>An: </b>%s<br />\n<p></p><b>Betreff:  </b>%s<br />\n<p></p>
                        <b>Ihre Nachricht: </b><p></p><br />%s</font><br />\n"
            ,    
                      
            date('D, d.m.Y'),
                      
            date('H:i:s'),
                      
            $vorname,
                      
            $nachname,
                      
            $eMail,
                      
            $empfaenger,
                      
            $betreff,
                      
            $nachrichtumbruch);



                include (
            "send.inc.php5");
            // Ende elsif

            ?>        
                    <p><font size="+2" color="#4b9e96"><a href="javascript:history.back()">zur&uuml;ck</a></font></p>
                </body>

            </html>
            Errorreporting ist natürlich an.
            Im Formular wurde eine Auswahlliste des Empängers eingebaut.
            Die Eingabefelder (bis auf nachname) werden daraufhin überprüft ob sie einen Inhalt haben,
            im nächsten Schritt will ich dann den Inhalt selbst noch prüfen.
            Hier empfand ich die foreach-Schleife eigentlich als elegante Lösung.

            Naja, dann wird heute mittag wieder umgeschriegeben und das Array aufgelöst.

            Was mich zuerst verwirrte war eine Anmerkung von H2O:
            Original geschrieben von H2O
            ...
            Dann machst du aus deinen Post-Variablen normale lokale Variable.
            Gib doch gleich diese aus, statt wieder $_POST zu bemühen.
            Und in der send.inc.php weist du diese Variablen, die du ja schon hast, wieder zu.
            ...
            Der Satz blieb mir im Gedächtnis, aber gerade fällt mir auf, daß ich in der
            Ursprünglichen send.inc.php noch
            PHP-Code:
            $eMail $_REQUEST['eMail'] ; 
            stehen hatte was in Verbindung mit den isset Überprüfungen und
            Zuweisung natürlich doppelt gemoppelt wäre und sich seine Aussage darauf bezog.

            Ich habe das jetzt so verstanden:

            Da ich eine Browserausgabe der im Formular eingetragenen Daten möchte,
            ist es Sinnvoll mein $_POST Array zu beginn aufzulösen und den Inhalt in
            lokale Variablen zu schreiben.
            Das $_POST Array bleibt im weiteren Verlauf ungenutzt, denn ich habe ja
            jetzt meine einzelnen Variablen (hmm, dann könnte ich das Array doch
            eigentlich löschen).
            Zur Weiterverarbeitung, ob nun Prüfung oder Ausgabe, bzw. beides
            werden nur noch die lokalen Variablen genutzt.
            htmlentities, bzw. htmlspecialchars werden direkt zur Ausgabe angewandt.
            Sprich wenn ich will daß im Betreff keine html-Zeichen sind wedne ich
            htmlentities, oder htmlspecialchars erst bei der Ausgabe an und nur auf die
            betreffende Variable.

            Einen Grund weshalb htmlentities verwendet wurde, gibt es eigentlich
            nicht, außer eben zur Darstellung der html- Tags.

            besten Dank!
            Greets

            Martin

            absolut beginner
            aber lernwillig

            Kommentar

            Lädt...
            X