neicooo: Kontaktformular versenden

Moin,

ich arbeite zum ersten mal mit php, ich würde gerne mein Kontaktformular per PHP versenden.

Im Internet habe ich dazu einige gute Tipps gefunden und denke auch es richtig umgesetzt zu haben, aber die Mails kommen nicht an und ich weiß nicht warum.

Hier mein Kontakrtformular:

	<form name="senden" action="senden.php" enctype="multipart/form-data" method="post" onsubmit="return check_form(this);">  
<input type="hidden" name="page_tv" value="" />  
<input type="hidden" name="page_tv_2" value="&auml;&ouml;&uuml;" />  
<input type="hidden" name="pflicht" value="absender_name,absender_text" />  
<input type="hidden" name="empfaenger_mail" value="neicooo@web.de" />  
<input type="hidden" name="empfaenger_name" value="" />  
<input type="hidden" name="betreff" value="" />  
<input type="hidden" name="page_background_color" value="#FFFFFF" />  
<input type="hidden" name="page_font_color" value="#000000" />  
<input type="hidden" name="language" value="de" />  
<span id="page_top" style="display: inline;"></span><table align="center" class="table" border="0" cellspacing="1" cellpadding="3">  
<tr>  
<td colspan="2" class="head" height="17" width="100%" align="left"><span class="font-big">Kontaktformular</span></td>  
</tr>  
<tr>  
<td colspan="2" class="main" height="16" width="100%"><span class="font-small">Bitte f&uuml;llen Sie alle mit * markierten Felder aus. (Pflichtfelder)</span></td>  
</tr>  
<tr>  
<td class="main" width="30%"><div class="align">Ihr Name:*</div></td>  
<td class="main"><input class="input" type="text" name="absender_name" size="20" /></td>  
</tr>  
<tr>  
<td class="main" width="30%"><div class="align">Betreff:</div></td>  
<td class="main"><input class="input" type="text" name="betreff" size="20" /></td>  
</tr>  
<tr>  
<td class="main" width="30%"><div class="align">Ihre E-Mail Adresse:*</div></td>  
<td class="main"><input class="input" type="text" name="absender_mail" size="20" /></td>  
</tr>  
<tr>  
<td class="main" width="30%"><div class="align">Ihre Nachricht:*</div></td>  
<td class="main">(Restzeichen: <span id="count_1">2500</span>)<br />  
<textarea class="textarea" name="absender_text" id="absender_text" cols="35" rows="8" onkeydown="rest(this,2500,'count_1',event)" onkeyup="rest(this,2500,'count_1',event)" onchange="rest(this,2500,'count_1',event)"></textarea></td>  
</tr>  
  
<tr><td class="main" width="30%"><div class="align"></div></td><td class="foot" align="center" height="25">&nbsp;&nbsp;<input class="button_send" type="submit" value="Abschicken" />&nbsp;&nbsp;&nbsp;<input class="button" type="reset" value="Zur&uuml;cksetzen" /></td></tr>  
</table>  
							</form>

Ich sende mittels Post die Daten an senden.php die so aussieht:

<?php  
$name = $_POST["absender_name"];    //Das Feld mit dem Namen name  
$email = $_POST["absender_mail"];   //Das Feld mit dem Namen email  
$betreff = $_POST["betreff"];  //Das Feld mit dem Namen betreff  
$nachricht = $_POST["absender_text"];  //Das Feld mit dem Namen nachricht  
$empfaenger = "neicooo@web.de";    //Empfaenger-Email  
  
?>
  1. Hi,

    ich arbeite zum ersten mal mit php, ich würde gerne mein Kontaktformular per PHP versenden.

    Im Internet habe ich dazu einige gute Tipps gefunden und denke auch es richtig umgesetzt zu haben, aber die Mails kommen nicht an und ich weiß nicht warum.

    Und wo versendest du die Mail?

    Ich sende mittels Post die Daten an senden.php die so aussieht:

    <?php

    $name = $_POST["absender_name"];    //Das Feld mit dem Namen name
    $email = $_POST["absender_mail"];   //Das Feld mit dem Namen email
    $betreff = $_POST["betreff"];  //Das Feld mit dem Namen betreff
    $nachricht = $_POST["absender_text"];  //Das Feld mit dem Namen nachricht
    $empfaenger = "neicooo@web.de";    //Empfaenger-Email

    ?>

      
    Hier jedenfalls nicht.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Ich hab in der Tat eine Zeile beim rüberkopieren vergessen.

      $versenden = mail($empfaenger, $betreff, $text, "From: ".$email."\nContent-Type: text/html; charset=iso-8859-1\n");  
      
      

      Damit funktioniert es jetzt auch. (:

      Noch eine Frage, wenn ich jetzt im Kontaktformular noch ein weiteres Eingabefeld mit aufnhemen möchte, sagen wir einfach mal Firmenname und ich nenne es auch firmenname.

      Kann ich das dann einfach mit

      $firmenname = $_POST["firmenname"];

      mit aufnehmen und das ganze dann in den Absendebefehl anhängen?

      1. Ich hab in der Tat eine Zeile beim rüberkopieren vergessen.

        $versenden = mail($empfaenger, $betreff, $text, "From: ".$email."\nContent-Type: text/html; charset=iso-8859-1\n");

          
        Gratulation zur Header-Injection - PHP sicher die [mail()](http://www.php.net/manual/de/function.mail.php)-Funktion nicht automatisch ab - das steht implizit so auch in der Dokumentation (sprich: to, subject und message müssen entsprechend behandelt werden).  
          
        
        > $firmenname = $\_POST["firmenname"];  
        >   
        > mit aufnehmen und das ganze dann in den Absendebefehl anhängen?  
          
        Sicher kannst du das - in erster Linie solltest du dich aber um deine signifikante Sicherheitslücke kümmern und folgenden Artikel verinnerlichen:  
        <http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel>
        
        1. Tach!

          $versenden = mail($empfaenger, $betreff, $text, "From: ".$email."\nContent-Type: text/html; charset=iso-8859-1\n");
          Gratulation zur Header-Injection - PHP sicher die mail()-Funktion nicht automatisch ab - das steht implizit so auch in der Dokumentation (sprich: to, subject und message müssen entsprechend behandelt werden).

          Das konnte ich der verlinkten Seite nicht entnehmen. Auch im englischen Original finde ich diese Information nicht. Nach meinen Code-Recherchen von vor einiger Zeit stimmt diese Aussage auch nicht (außer für mittlerweile total veraltete PHP-Versionen). Die Felder to und subject werden gegen Header-Injection in der Form gesichert, dass Steuerzeichen durch Leerzeichen ausgetauscht werden. Damit ist Header-Injection in der Form nicht mehr möglich. Das Feld message kommt hingegen mit dem Header gar nicht mehr in Berührung. Dort ist lediglich der Kontext der Message selbst zu beachten, also bei Plaintext-Mail nichts weiter und bei HTML die üblichen HTML-eigenen Zeichen.

          Selbst beachtet werden müssen allerdings die additional_headers. Dort werden keine Zeichen herausgefiltert, weil das auch die gewollte Funktionalität verhindern würde. (Bleibt noch additional_parameters, das muss individuell entschieden werden, wenn man es denn verwendet.)

          $firmenname = $_POST["firmenname"];
          mit aufnehmen und das ganze dann in den Absendebefehl anhängen?

          Das Umkopieren in einfache Variablen ist sinnfrei. Wichtiger ist die Beachtung des Kontextwechsels beim Einfügen in das jeweilige Ziel.

          Sicher kannst du das - in erster Linie solltest du dich aber um deine signifikante Sicherheitslücke kümmern und folgenden Artikel verinnerlichen:
          http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

          Da gibt es auch (in der Fortsetzung) einen Abschnitt zur Email. Die signifikante Sicherheitslücke findet sich aber in seinem Fall "nur" beim Einfügen des From-Wertes. Wie der HTML-Teil zusammengebaut wird, und ob da Lücken drin sind, ist in seinem Posting nicht zu sehen.

          dedlfix.

          1. Das konnte ich der verlinkten Seite nicht entnehmen. Auch im englischen Original finde ich diese Information nicht.

            "The formatting of this string must comply with » RFC 2822."

            "Caution  Subject must satisfy » RFC 2047."

            Heißt für mich so viel wie "Achtung: schau bei den Werten, dass diese korrekt sind.

            Nach meinen Code-Recherchen von vor einiger Zeit stimmt diese Aussage auch nicht [...]

            Ich sollte hier auch mal wieder nachschaun.

            1. Ich hab keine ahnung wovon ihr da redet.

              Ich habe jedenfalls noch ein Problem.

              <?php  
              $text = $_POST[name]."\n".$_POST[nachricht]."\n".$_POST[email]."\n".;  
              mail("neicooo@web.de","Nachricht von $_POST[name]",$text);  
              ?>
              

              Ich würde gerne vor den einzelnen Variablen (name, nachricht, email) in der E-Mail noch eine Beschreibung der Variable haben.

              Sprich in der E-Mail soll der Inhalt so zu sehen sein:

              Name: Variable Name
              E-Mail: Variable E-Mail
              Nachricht: Variable Nachricht

              Wie genau muss ich das in den code einfügen, damit es später in meiner E-Mail zu sehen ist?

              1. Wie genau muss ich das in den code einfügen, damit es später in meiner E-Mail zu sehen ist?

                http://php.net/manual/de/language.types.string.php

              2. servus neicooo,

                Ich hab keine ahnung wovon ihr da redet.

                Stichwort Kontextwechsel. Du musst die Werte von Variablen so anpassen, dass sie der Umgebung, in die sie kommen, keinen Mist mehr anstellen können.
                Willst du zum Beispiel keine Mail versenden, sondern die Daten in einer DB speichern, musst du die Daten vorher mit entsprechenden Methoden/Funktionen bearbeiten. Sonst schreibt dir einer folgende Nachricht: "DROP TABLE user" (vereinfacht)
                Deine Tabelle user, sollte sie existieren, ist dann weg.
                Auch beim Mail-Versand musst du die Variablen prüfen. Willst du mehr wissen?
                Lies diesen Artikel zu Kontextwechsel

                Ich habe jedenfalls noch ein Problem.

                <?php

                $text = $_POST[name]."\n".$_POST[nachricht]."\n".$_POST[email]."\n".;
                mail("neicooo@web.de","Nachricht von $_POST[name]",$text);
                ?>

                  
                Zunächst: Achte darauf, Keys mit Anführungszeichen zu benutzen. `$_POST[name]`{:.language-php} mag zwar jetzt genau das beinhalten, was du willst, solltest du aber jemals eine Konstante "name" in deinen Code einfügen, gilt der Wert und nicht der Name der Konstante. Außerdem gibt es von PHP ein Notice, dass du eine nicht definierte Konstante benutzt.  
                Benutze also `$_POST["name"]`{:.language-php} etc.  
                  
                
                > Ich würde gerne vor den einzelnen Variablen (name, nachricht, email) in der E-Mail noch eine Beschreibung der Variable haben.  
                >   
                > Sprich in der E-Mail soll der Inhalt so zu sehen sein:  
                >   
                > Name: Variable Name  
                > E-Mail: Variable E-Mail  
                > Nachricht: Variable Nachricht  
                >   
                > Wie genau muss ich das in den code einfügen, damit es später in meiner E-Mail zu sehen ist?  
                  
                Trag es in die Variable $text ein.  
                `$text = "Name: " . $_POST["name"] . "\n" . "E-Mail: " . $_POST["email"]; // und so weiter`{:.language-php}  
                  
                mit `"\n"`{:.language-php} erzeugst du einen Zeilenumbruch. Du kannst `"\n"`{:.language-php} und `"E-Mail"`{:.language-php} auch in einem String schreiben: `"\nE-Mail"`{:.language-php}, der Übersicht (und des Verständnisses) halber habe ich sie aber getrennt.  
                  
                [Zeichenkettenoperatoren](http://php.net/manual/de/language.operators.string.php)  
                [Escaped characters](http://www.php.net/manual/de/language.types.string.php#language.types.string.syntax.double)  
                  
                henf
                
                -- 
                Life is hard, right?  
                No, life is easy! YOU suck!
                
                1. Tach!

                  $text = $_POST[name]."\n".$_POST[nachricht]."\n".$_POST[email]."\n".;

                  mail("neicooo@web.de","Nachricht von $_POST[name]",$text);

                  
                  > Zunächst: Achte darauf, Keys mit Anführungszeichen zu benutzen. `$_POST[name]`{:.language-php} mag zwar jetzt genau das beinhalten, was du willst, solltest du aber jemals eine Konstante "name" in deinen Code einfügen, gilt der Wert und nicht der Name der Konstante. Außerdem gibt es von PHP ein Notice, dass du eine nicht definierte Konstante benutzt.  
                  > Benutze also `$_POST["name"]`{:.language-php} etc.  
                    
                  Das ist kontextabhängig. In der ersten Zeile stehen die Variablen "einfach so" da. Hier ist die Schreibweise ohne Anführungszeichen tatsächlich ein Notice-Fehler. In der zweiten Zeile steht $\_POST[name] innerhalb eines ""-Strings, da ist die Schreibweise ohne Anführungszeichen richtig. Alternativ gibt es noch die {}-Syntax. Details und alle möglichen Varianten sind im PHP-Handbuch im Kapitel zu den [Strings](http://de2.php.net/manual/en/language.types.string.php) beschrieben.  
                    
                  Andererseits kommt man selten in den "Genuss", Variablen direkt in Strings einzubetten, weil man meist wegen des Kontextwechsels eine Escape-Funktion aufrufen muss, wofür man den String verlassen muss.  
                    
                  
                  > Trag es in die Variable $text ein.  
                  > `$text = "Name: " . $_POST["name"] . "\n" . "E-Mail: " . $_POST["email"]; // und so weiter`{:.language-php}  
                    
                  Aber bitte mit Kontextwechselbeachtung, es soll ja schließlich HTML erzeugt werden.  
                    
                    
                  dedlfix.