mightytrikkster: Formmailer sendet nicht alle Daten

Guten Tag.
Ich besitze keine Erfahrung in PHP und benötige etwas Hilfe bei der Lösung folgenden Problems:
Den Formmailer, den ich benutze, sendet nicht alle Formulardaten.
Präziser: er sendet nur die Felder "subject" und "comment".
vielen Dank für die Hilfe!

[code lang=php]<?php
include ("config.php");

$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$fromaddress = $_POST['email'];
$email = $_POST['email'];
if(isset($_POST['url'])){
$url = $_POST['url'];
}else{$url = "Keine URL übermittelt";}
$phone = $_POST['phone'];
$subject = $_POST['subject'];
$body = $_POST['comment'];

$message = $lastname." hat eine E-Mail gesendet:\r\n E-Mail: ".$email."\r\nURL: ".$url."\r\nTelefon: ".$phone."\r\n\n\nBetreff: ".$subject."\r\n\nNachricht:\r\n".
$body."\r\n\n";

$eol = "\r\n";
$mime_boundary=md5(time());

$headers .= 'From: '.$firstname.' '.$lastname.' <'.$fromaddress.'>'.$eol;
  $headers .= 'Reply-To: '.$firstname.' '.$lastname.' <'.$fromaddress.'>'.$eol;
  $headers .= 'Return-Path: '.$firstname.' '.$lastname.' <'.$fromaddress.'>'.$eol;
  $headers .= "Message-ID: <".time()." TheSystem@".$_SERVER['SERVER_NAME'].">".$eol;
  $headers .= "X-Mailer: PHP v".phpversion().$eol;
  $headers .= 'MIME-Version: 1.0'.$eol;
  $headers .= "Content-Type: multipart/related; boundary="".$mime_boundary.""".$eol;

$msg .= "Content-Type: multipart/alternative".$eol;
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/plain; charset=utf-8".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= strip_tags(str_replace("<br>", "\n", $message)).$eol.$eol;
$msg .= "--".$mime_boundary.$eol;
$msg .= "Content-Type: text/html; charset=utf-8".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol;
$msg .= str_replace("\n", "<br>", $message).$eol.$eol;
$msg .= "--".$mime_boundary."--".$eol.$eol;
ini_set(sendmail_from, $fromaddress);  // the INI lines are to force the From Address to be used !
$formsent = mail($mailto, $messagesubject, $msg, $headers);
ini_restore(sendmail_from);

?>

  1. Moin!

    Guten Tag.
    Ich besitze keine Erfahrung in PHP und benötige etwas Hilfe bei der Lösung folgenden Problems:
    Den Formmailer, den ich benutze, sendet nicht alle Formulardaten.
    Präziser: er sendet nur die Felder "subject" und "comment".

    Dein Formmailer ignoriert alle relevanten Sicherheitsmechanismen, die man zwingend nutzen muss, um sich nicht als willige Spamschleuder mißbrauchen zu lassen. Es gibt nirgendwo Prüfungen und Sicherheitsvorkehrungen gegen SMTP-Header-Injection - so wie das Skript derzeit aussieht, sollte es unverzüglich offline genommen werden - eine Reparatur ist aufwendiger, als es beispielsweise durch das Skript von http://aktuell.de.selfhtml.org/artikel/php/form-mail/ zu ersetzen.

    Weiterhin: Wenn Formularfelder nicht verschickt werden, kann das sowohl am sendenden Skript, aber auch am Formular liegen - das kennen wir aber nicht.

    - Sven Rautenberg

    1. Sehe wohl das Problem nicht... Sorry!

      1. Hallo

        Sehe wohl das Problem nicht... Sorry!

        Nix für ungut, aber was ist an ...

        »» ... so wie das Skript derzeit aussieht, sollte es unverzüglich offline genommen werden - eine Reparatur ist aufwendiger, als es beispielsweise durch das Skript von http://aktuell.de.selfhtml.org/artikel/php/form-mail/ zu ersetzen.

        ... missverständlich? Das Skript ansich ist ein Sicherheitsleck, dass am besten durch seine Stillegung gestopft wird. Zudem ist eine Alternative angegeben und verlinkt, die auch gleich eine Erklärung seiner selbst mitbringt. Wenn du damit Probleme haben solltest (kann ja sein), frage hier nach. Ist dieser Thread noch nicht archiviert, frage bitte *hier*, in diesem Thread, nach.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        Veranstaltungsdatenbank Vdb 0.3
        1. Hallo
          Weshalb sollte ich damit ein Problem haben? Das Skript stammt nicht von mir.
          Da ich - wie schon erwähnt - keine Erfahrung mit PHP habe, sehe ich das Problem nicht. Leider wurde mir auch nicht erklärt, weshalb das verwendete Skript ein Sicherheitsrisiko darstellt.
          Bitte also um Erklärung.
          Ob das Beispiel für mich was taugt, weiss ich noch nicht. Beim ersten Versuch wurde überhaupt keine Nachricht versendet.

          Hallo

          »» Sehe wohl das Problem nicht... Sorry!

          Nix für ungut, aber was ist an ...

          »» »» ... so wie das Skript derzeit aussieht, sollte es unverzüglich offline genommen werden - eine Reparatur ist aufwendiger, als es beispielsweise durch das Skript von http://aktuell.de.selfhtml.org/artikel/php/form-mail/ zu ersetzen.

          ... missverständlich? Das Skript ansich ist ein Sicherheitsleck, dass am besten durch seine Stillegung gestopft wird. Zudem ist eine Alternative angegeben und verlinkt, die auch gleich eine Erklärung seiner selbst mitbringt. Wenn du damit Probleme haben solltest (kann ja sein), frage hier nach. Ist dieser Thread noch nicht archiviert, frage bitte *hier*, in diesem Thread, nach.

          Tschö, Auge

          1. Moin!

            Weshalb sollte ich damit ein Problem haben? Das Skript stammt nicht von mir.

            Aber du verwendest es, bist also mindestens mittelbar für Probleme damit verantwortlich.

            Da ich - wie schon erwähnt - keine Erfahrung mit PHP habe, sehe ich das Problem nicht. Leider wurde mir auch nicht erklärt, weshalb das verwendete Skript ein Sicherheitsrisiko darstellt.

            Doch, das habe ich getan. Zitat: "Es gibt nirgendwo Prüfungen und Sicherheitsvorkehrungen gegen SMTP-Header-Injection".

            Bitte also um Erklärung.

            Wenn ich da ins Detail gehen würde, wäre das ein aufwendiger Vorgang, der der Reparatur des Skriptes gleich käme.

            Informiere dich aber gern mit dem oben genannten Suchbegriff bei einer Suchmaschine deines Vertrauens, das Thema wird ausführlich behandelt.

            - Sven Rautenberg

            1. Hallo,

              »» Bitte also um Erklärung.
              Wenn ich da ins Detail gehen würde, wäre das ein aufwendiger Vorgang, der der Reparatur des Skriptes gleich käme.

              deshalb hier nur eine Kurzfassung: Das vom OP benutzte Script verwendet Benutzereingaben, ohne sie auch nur im Geringsten auf formale Korrektheit und Plausibilität zu überprüfen. Durch "geschickte" Eingaben kann man daher leicht erreichen, dass dieses Script eine Message nicht nur an die gewünschte Adresse verschickt, sondern auch noch an -zig andere. Also die perfekte Spamschleuder.

              Informiere dich aber gern mit dem oben genannten Suchbegriff bei einer Suchmaschine deines Vertrauens, das Thema wird ausführlich behandelt.

              ACK.

              So long,
               Martin

              --
              Wenn man sieht, was der liebe Gott auf der Erde so alles zulässt, hat man das Gefühl, er experimentiert immer noch.
                (Sir Peter Ustinov, Charakterdarsteller, 2004 verstorben)
              1. Vielen Dank für die Erklärung.

                Eingaben werden hier überprüft:
                [code lang=javascript]jQuery.fn.validationEngine = function(settings) {
                if($.validationEngineLanguage){ // IS THERE A LANGUAGE LOCALISATION ?
                allRules = $.validationEngineLanguage.allRules
                }else{
                allRules = {"required":{       // Add your regex rules here, you can take telephone as an example
                "regex":"none",
                "alertText":"* Eingabe erforderlich!",
                "alertTextCheckboxMultiple":"* Bitte w&auml;hlen Sie eine Option",
                "alertTextCheckboxe":"* Diese Checkbox wird ben&ouml;tigt"},
                "length":{
                "regex":"none",
                "alertText":"* Zwischen ",
                "alertText2":" und ",
                "alertText3": " Zeichen erlaubt"},
                "minCheckbox":{
                "regex":"none",
                "alertText":"* Anzahl erlaubter Optionen &uuml;berschritten"},
                "confirm":{
                "regex":"none",
                "alertText":"* Die Eingabe stimmt nicht &uuml;berein"},
                "telephone":{
                "regex":"/[1]+$/",
                "alertText":"* Ung&uuml;ltige Telefonnummer"},
                "email":{
                "regex":"/[2]+@([a-zA-Z0-9-]+.)+[a-zA-Z0-9]{2,4}$/",
                "alertText":"* Ung&uuml;ltige E-Mail Adresse"},
                "date":{
                                             "regex":"/[3]{1,2}.[0-9]{1,2}.[0-9]{4}$/",
                                             "alertText":"* Ung&uuml;ltiges Datum: TT.MM.JJJJ verwenden"},
                "onlyNumber":{
                "regex":"/[4]+$/",
                "alertText":"* Nur Zahlen von 0-1 erlaubt"},
                "noSpecialCaracters":{
                "regex":"/[5]+$/",
                "alertText":"* Keine speziellen Buchstaben erlaubt"},
                "onlyLetter":{
                "regex":"/[6]+$/",
                "alertText":"* Nur Buchstaben verwenden"}
                }
                }


                1. 0-9-()\ ↩︎

                2. a-zA-Z0-9_.- ↩︎

                3. 0-9 ↩︎

                4. 0-9\ ↩︎

                5. 0-9a-zA-Z ↩︎

                6. a-zA-ZÄäÖöÜüÉéÈè\ ' ↩︎

                1. Hallo,

                  Vielen Dank für die Erklärung.
                  Eingaben werden hier überprüft:

                  jQuery.fn.validationEngine = function(settings) {

                  [...]
                  }

                    
                  nein, das ist Javascript, und damit clientseitig, und kann daher beliebig manipuliert werden. Das ist ein nettes Nice-To-Have-Feature, aber die endgültige Prüfung MUSS serverseitig stattfinden, denn  
                    
                   \* clientseitige Prüfungen sind manipulierbar (s.o.)  
                   \* clientseitige Prüfungen sind deaktivierbar (JS einfach abstellen)  
                   \* niemand ist gezwungen, dieses Formular zu verwenden, um einen Request an  
                     deinen Formmailer zu senden, der Request kann auch mit beliebigen anderen  
                     Formularen oder komplett anderen (non-Browser-)Clients generiert werden  
                    
                  So long,  
                   Martin  
                  
                  -- 
                  Moskito, ergo summ.
                  
                  1. Danke.
                    Einen Vorschlag? Oder einen anderen Mailer?
                    Was genau sollte das Skript prüfen?

                  2. Habe den Mailer nun um folgende Funktion erweitert - reicht das?
                    [code lang=php]function checkMail($email) {
                    $patter = "![1]+[w.-]+@[a-z0-9]+[w.-]+.[a-z]{2,4}$!i";
                    if(preg_match($patter, $email)) {
                    return true;
                    } else {
                    return false;
                    }
                    }


                    1. a-z0-9 ↩︎

                    1. Moin!

                      Habe den Mailer nun um folgende Funktion erweitert - reicht das?

                      Die Funktion sortiert korrekte Mailadressen als falsch aus. Top-Level-Domainnamen sind schon heute länger als 4 Zeichen, und theoretisch in der Länge nur auf die für jeden Domain-Bestandteil geltenden 64 Zeichen beschränkt. Außerdem wird es mit Sicherheit in naher Zukunft auch Domains geben, die nicht mehr nur die Zeichen A bis Z benutzen, sondern auch im TLD-Bereich Umlaute und sonstige Unicode-Zeichen erlauben.

                      All diese Dinge ignoriert deine Testfunktion.

                      Abgesehen davon bringt es nichts, die Testfunktion zu betrachten, wenn man ihre Anwendung nicht kennt.

                      [code lang=php]function checkMail($email) {
                      $patter = "![1]+[w.-]+@[a-z0-9]+[w.-]+.[a-z]{2,4}$!i";
                      if(preg_match($patter, $email)) {
                      return true;
                      } else {
                      return false;
                      }
                      }

                      - Sven Rautenberg


                      1. a-z0-9 ↩︎

    2. Hier das Formular:

      [code lang=html        <form id="contact" class="formular" method="post" action="" name="contact">
                <fieldset>
                <legend>Kontaktinformationen</legend>

      <label> <span>Vorname:</span>
                <input class="validate[required,custom[onlyLetter],length[0,100]] text-input" type="text" name="firstname" id="firstname"/>
                </label>
                <label> <span>Nachname:</span>
                <input class="validate[required,custom[onlyLetter],length[0,100]] text-input" type="text" name="lastname" id="lastname"/>
                </label>

      <label> <span>Gewünschte Informationen:</span>
                <select name="info" id="info"  class="validate[required]"  >
                  <option value="">Bitte wählen Sie eine Option</option>
                  <option value="option1">Newsletter bestellen</option>
                  <option value="option2">Veranstaltungstermine</option>
                  <option value="option3">Genereller Kontakt</option>
                </select>
                </label>

      <label> <span>Telefonnummer: </span>
                <input class="validate[required,custom[telephone]] text-input" type="text" name="phone" id="phone"/>
                </label>
                </fieldset>

      <fieldset>
                <legend>E-Mail</legend>
                <label> <span>E-Mail Adresse: </span>
                <input class="validate[required,custom[email]] text-input" type="text" name="email" id="email" />
                </label>
                <label> <span>E-Mail Adresse wiederholen: </span>
                <input class="validate[required,confirm[email]]] text-input" type="text" name="email2"/>
                </label>
                </fieldset>
                <fieldset>
                <legend>Nachricht</legend>
                <label> <span>Betreff: </span>
                <input class="text-input" type="text" name="subject" id="subject" />
                </label>
                <label> <span>Nachricht: </span>
                <textarea class="validate[required,length[6,300]] text-input" name="comment" id="comment" /> </textarea>
                </label>
                </fieldset>

      <input class="reset" type="reset" value="L&ouml;schen"/>
                <input class="submit" type="submit" value="Senden"/>
                <hr/>
              </form>