Simon: Kontaktformular

Hi,
bin grad dabei mein Kontaktformular neu zu machen. Ich bekomme nur gerade folgende Fehlermeldung und finde nicht den Fehler:
Parse error: syntax error, unexpected '<' in ....... on line 49

Hier das Script:
1 <?php
2 if (@$_POST['gesendet']) {
3   $vorname = @$_POST['vorname'];
4   $nachname = @$_POST['nachname'];
5   $email = @$_POST['email'];
6   $nachricht = @$_POST['nachricht'];
7
8 if ( get_magic_quotes_gpc() ) {
9   $vorname = stripslashes($vorname);
10   $nachname = stripslashes($nachname);
11   $email = stripslashes($email);
12   $nachricht = stripslashes($nachricht);
13 }
14
15 $fehler_nachricht=array();
16
17 if ($vorname=="") {
18 $fehler_nachricht[] ="Bitte geben Sie Ihren Vornamen ein";
19 }
20
21 if ($nachname=="") {
22 $fehler_nachricht[] ="Bitte geben Sie Ihren Nachnamen ein";
23 }
24
25 if ($email=="") {
26 $fehler_nachricht[] ="Bitte geben Sie Ihre E-Mail Adresse ein";
27 }
28
29 if ($nachricht=="") {
30 $fehler_nachricht[] ="Vergessen Sie nicht, Ihre Nachricht zu hinterlassen!";
31 }
32
33
34 $ziel_email="admin@heimgeistig.at";
35 $email_betref="heimgeistig-Kontaktformular";
36 $email_hauptteil ="$vorname.'<br />'.$nachname.'<br />'.$nachricht.'<br />'.$email;
37
38   if (!$fehler_nachricht) {
39   mail ($ziel_email, $email_betreff, $email_hauptteil);
40   header ('location: form_confirm.php);
41   exit();
42   }
43 }
44 ?>
45
46 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
47 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
48
49 <html xmlns="http://www.w3.org/1999/xhtml">
50 <head>
51 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
52 <title>Kontakt</title>
53 <link type="text/css" media="screen" href="css/design.css" />
54 </head>
55 <body>
56   <div id="content">
57     <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
58
59
60
61       <h3>Senden Sie mir eine Nachricht!</h3>
62
63     <?php
64     if ($fehler_nachricht) {
65     echo "<ul>\n";
66       foreach ($fehler_nachricht as $fehler) {
67       echo"<li>".$fehler."</li>\n";
68       }
69     echo "</ul>\n";
70     }
71     ?>
72     <label for="vorname">Vorname*</label><br />
73       <input name="vorname" type="text" size="20" id="vorname" value="<?php echo $vorname ?>" /><br />
74     <label for="nachname">Nachname*</label><br />
75       <input name="nachname" type="text" size="20" id="nachname" value="<?php echo $nachname ?>" /><br />
76     <label for="email">Email*</label><br />
77       <input name="email" type="text" size="20" id="email" value="<?php echo $email ?>" /><br />
78     <label for="Nachricht">Geben Sie hier Ihre Kommentare oder Fragen ein.</label><br />
79       <textarea name="nachricht" rows="3" cols="20" id="nachricht"><?php echo $nachricht ?></textarea><br />
80     <p>Ihre Angaben werden weder verkauft noch an andere weitergegeben</p>
81       <input type="submit" name="gesendet" value="Senden" />
82     </form>
83   </div>
84 </body>
85 </html>

MFG
Simon

  1. Hi,

    36 $email_hauptteil ="$vorname.'<br />'.$nachname.'<br />'.$nachricht.'<br />'.$email;

    br's haben da nix zu suchen. Ausserdem kann Dir ein Angreifer leicht unerwünschte Headerzeilen unterschieben, wenn Du diese Angaben nicht validierst.

    40   header ('location: form_confirm.php);

    hier fehlt ein schliessendes '

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. 36 $email_hauptteil ="$vorname.'<br />'.$nachname.'<br />'.$nachricht.'<br />'.$email;
      br's haben da nix zu suchen. Ausserdem kann Dir ein Angreifer leicht unerwünschte Headerzeilen unterschieben, wenn Du diese Angaben nicht validierst.

      ja die validierung muss ich erst machen. Ich wollte nur testen ob bis jezt allses funktioniert.

      40   header ('location: form_confirm.php);
      hier fehlt ein schliessendes '

      ok danke

      mfg
      Simon

    2. 36 $email_hauptteil ="$vorname.'<br />'.$nachname.'<br />'.$nachricht.'<br />'.$email;
      br's haben da nix zu suchen. Ausserdem kann Dir ein Angreifer leicht unerwünschte Headerzeilen unterschieben, wenn Du diese Angaben nicht validierst.

      Ist schon richtig, daß man bei PHP wie ein Schiesshund auf solche Sachen peinlich acht geben muss. Hat Simon in dem Fall aber getan. Alle Stringvariablen ergeben sich aus  $_POST[] bzw. @$_POST[] und sind damit narrensicher.

      1 <?php
      2 if (@$_POST['gesendet']) {
      3   $vorname = @$_POST['vorname'];
      4   $nachname = @$_POST['nachname'];
      5   $email = @$_POST['email'];
      6   $nachricht = @$_POST['nachricht'];

      Die Werte können nur aus einer Aktion stammen die was mit POST zu tun hat. Können in einer Headerzeile also jetzt nicht mehr angegriffen werden, etwa so:
      /script.php?vorname=stefan&name=muenz....

      wichtiges Thema! Nicht umsonst wird bei heise.de im Forum immer und immer wieder ghöhnt, geätzt und gelächtert wenns um irgendwas rund um PHP geht. mal "taugt PHP nix", ist nur für "Anfänger oder Amateure" und und... Dabei muss man faktisch gesehen nur einige Sicherheitsregeln beachten. Leider gibts bis dato kein übersichtliches Kompendium für PHP Sicherheit was man genauso schnell lernen kann wie PHP selber!?
      aaaber auch da lass ich mich gern hauen und eines besseren belehren :)

      schönen Sonntag

      1. echo $begrüßung;

        36 $email_hauptteil ="$vorname.'<br />'.$nachname.'<br />'.$nachricht.'<br />'.$email;
        br's haben da nix zu suchen. Ausserdem kann Dir ein Angreifer leicht unerwünschte Headerzeilen unterschieben, wenn Du diese Angaben nicht validierst.

        Nun, in dem Fall nicht, weil er gar keine Benutzereingaben in Headerzeilen einfließen lässt. Sie landen nur im Body und da sind sie aus Email-Sicht ungefährlich.

        Ist schon richtig, daß man bei PHP wie ein Schiesshund auf solche Sachen peinlich acht geben muss.

        Das ist kein Alleinstellungsmerkmal PHPs. In jeder Programmiersprache muss man sicherstellen, dass dies nicht passieren kann.

        Hat Simon in dem Fall aber getan. Alle Stringvariablen ergeben sich aus  $_POST[] bzw. @$_POST[] und sind damit narrensicher.

        Das ist eine unsinnige Aussage, die vermutlich auf einem Irrtum deinerseits beruht.

        3   $vorname = @$_POST['vorname'];

        Eine solche Umkopiererei ist schon deshalb nicht narrensicher, weil dieser Vorgang unnötig ist, es die Herkunft des Wertes verschleiert und mehr Variablen die Komplexität nicht verringern.

        Die Werte können nur aus einer Aktion stammen die was mit POST zu tun hat. Können in einer Headerzeile also jetzt nicht mehr angegriffen werden, etwa so:
        /script.php?vorname=stefan&name=muenz....

        Das ist keine Headerzeile. Das ist ein Teil einer URL mit einem Query-String. Es geht um die Headerzeilen einer Email.  Egal wo die Werte für Betreff, Empfänger und zusätzliche Header herkommen (GET, POST, Cookie, usw.), sind sie dahingehend zu überprüfen, dass sie keine ungewollten Zeilenumbrüche enthalten, denn dadurch kommt die Email-Header-Injection zustande.

        wichtiges Thema! Nicht umsonst wird bei heise.de im Forum immer und immer wieder ghöhnt, geätzt und gelächtert wenns um irgendwas rund um PHP geht. mal "taugt PHP nix", ist nur für "Anfänger oder Amateure" und und...

        Wer auf diese unsachlichen (Inhalt und Stil) Aussagen etwas gibt ist in dem Punkt vermutlich auch nicht viel klüger als der Schreiber.

        Dabei muss man faktisch gesehen nur einige Sicherheitsregeln beachten. Leider gibts bis dato kein übersichtliches Kompendium für PHP Sicherheit was man genauso schnell lernen kann wie PHP selber!?

        Sicherheit ist kein einmalig und einfach zu erlernender Lehrstoff. "PHP schnell lernen" bezieht sich auch nur auf die Grundlagen und kann umfassend ebenso wenig in kürzester Zeit erlernt werden wie das für natürliche Sprachen gern angepriesen wird. Ein Artikel, der sich mit der sicherheitstechnisch relevanten Konfiguration von PHP beschäftigt wäre Grundsicherung für PHP-Software. Weiterhin hat das PHP-Handbuch ein Hauptkapitel mit Sicherheit überschrieben, in dem diverse Aspekte rund ums Thema abgehandelt werden. Das Wichtigste ist jedoch nicht die genügend vorhandene Literatur zum Thema sondern der Erkenntnisprozess eines jeden beginnenden Programmierers, dass zwischen "funktioniert wie gewünscht" und "ist robust gegen Fehlerzustände und immun gegen Angriffe" eine große Lücke gibt, die es mit Code auszufüllen gilt, der oftmals umfangreicher wird als der für die eigentliche Aufgabe.

        echo "$verabschiedung $name";

  2. Hi,
    hab noch eine andere Frage: In den Emails die ich schreibt mir das Scripts die ganzen Variablen einfach in einer Schlange und nicht untereinander.
    Gibt es eine andere möglichkeit als die <br />, weil sie auch nicht funktionieren?

    mfg
    Simon

    1. Hi,

      Gibt es eine andere möglichkeit als die <br />, weil sie auch nicht funktionieren?

      Versuche mal "\n" oder "\r" oder stelle den MIME-Type auf HTML.

      Gruß
      mr. php

      1. also mit r funktionierts auch nicht.
        Hätte da auch nich eine andere Frage: wie kann ich unter diesen Daten in der Email das Datum und die Uhrzeit schreiben.
        Hab noch mal das fertige Script:

        <?php
        include ("form_validation.php");
        if (@$_POST['gesendet']) {
          $vorname = @$_POST['vorname'];
          $nachname = @$_POST['nachname'];
          $email = @$_POST['email'];
          $nachricht = @$_POST['nachricht'];

        if ( get_magic_quotes_gpc() ) {
          $vorname = stripslashes($vorname);
          $nachname = stripslashes($nachname);
          $email = stripslashes($email);
          $nachricht = stripslashes($nachricht);
        }

        $gueltig = verifiziereAlphaNum ($vorname);
        if (!$gueltig) {
        $fehler_nachricht[]="Vorname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und ' bestehen.";
        }

        $gueltig = verifiziereAlphaNum ($nachname);
        if (!$gueltig) {
        $fehler_nachricht[]="Nachname darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrichen und ' bestehen.";
        }

        $gueltig = verifiziereEmail ($email);
        if (!$gueltig){
        $fehler_nachricht[]="Email muss ein gültiges Format besitzen (z.B. beispiel@hotmail.com).";
        }

        $gueltig = verifiziereText ($nachricht);
        if (!$gueltig){
        $fehler_nachricht[]="Nachricht darf nur Buchstaben, Zahlen und diese Zeichen enthalten " ' - ? ! enthalten";
        }

        $ziel_email="admin@heimgeistig.at";
        $email_betref="heimgeistig-Kontaktformular";
        $email_hauptteil =$vorname.'\r'.$nachname.'\r'.$nachricht.'\r'.$email;

        if (!$fehler_nachricht) {
          mail ($ziel_email, $email_betreff, $email_hauptteil);
          header ('Location: form_confirm.php');
          exit();
          }
        }
        ?>

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Kontakt</title>
        <link type="text/css" media="screen" href="css/design.css" />
        </head>
        <body>
          <div id="content">
            <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

        <h3>Senden Sie mir eine Nachricht!</h3>

        <?php
            if ($fehler_nachricht) {
            echo "<ul>\n";
              foreach ($fehler_nachricht as $fehler) {
              echo"<li>".$fehler."</li>\n";
              }
            echo "</ul>\n";
            }
            ?>
            <label for="vorname">Vorname*</label><br />
              <input name="vorname" type="text" size="20" id="vorname" value="<?php echo $vorname ?>" /><br />
            <label for="nachname">Nachname*</label><br />
              <input name="nachname" type="text" size="20" id="nachname" value="<?php echo $nachname ?>" /><br />
            <label for="email">Email*</label><br />
              <input name="email" type="text" size="20" id="email" value="<?php echo $email ?>" /><br />
            <label for="Nachricht">Geben Sie hier Ihre Kommentare oder Fragen ein.</label><br />
              <textarea name="nachricht" rows="3" cols="20" id="nachricht"><?php echo $nachricht ?></textarea><br />
            <p>Ihre Angaben werden weder verkauft noch an andere weitergegeben</p>
              <input type="submit" name="gesendet" value="Senden" />
            </form>
          </div>
        </body>
        </html>

        und das form_validation.php:

        <?php
        //print "includet OK";
        function verifiziereAlphaNum ($testString) {
          if (eregi ("^([[:alnum:]]|-|.| |')+$", $testString)) {
            return 1;
         } else {
            return 0;
         }
        }

        function verifiziereEmail ($testString) {
          if (eregi("^([[:alnum:]]|_|.|-)+@([[:alnum:]]|.|-)+(.)([a-z]{2,4})$", $testString)) {
            return 1;
         } else {
            return 0;
         }
        }

        function verifiziereText ($testString) {
          if (eregi("^([[:alnum:]]|-|.| |\n|\r|?|!|"|'')+$", $testString)) {
            return 1;
         } else {
            return 0;
         }
        }

        ?>

        MFG
        Simon

        1. Hi,

          Bitte beschränke doch den Quellcode aufs Wesentliche.

          also mit r funktionierts auch nicht.

          wenns ein linux server ist verwende \n um Zeilenumbrüche zu erzeugen.

          Hätte da auch nich eine andere Frage: wie kann ich unter diesen Daten in der Email das Datum und die Uhrzeit schreiben.

          mit date

          Gruesse, Joachim

          --
          Am Ende wird alles gut.
          1. wenns ein linux server ist verwende \n um Zeilenumbrüche zu erzeugen.

            Hab jezt schon alles ausprobiert, aber leider funktioniert es nicht.
            Gibt es noch eine andere Möglichkeit einen Zeilenumbruch zu erzeugen?

            Hier das Script:

            $ziel_email="admin@heimgeistig.at";
            $email_hauptteil =$vorname.'\r'.$nachname.'\r'.$nachricht.'\r'.$email;

            if (!$fehler_nachricht) {
              mail ($ziel_email, $betreff, $email_hauptteil, "From: ".$_REQUEST['email']);
              header ('Location: form_confirm.php');
              exit();
              }

            MFG
            Simon

            1. Hi,

              Gibt es noch eine andere Möglichkeit einen Zeilenumbruch zu erzeugen?

              Warum nimmst du nicht den Rat von "mr. php" mit dem MIME-Typ für HTML an? Dies wäre nämlich eine andere Möglichkeit mit dem schönen neben Effekt, dass die Mail auch noch besser gestalltet werden kann.

              1. Hi,

                Warum nimmst du nicht den Rat von "mr. php" mit dem MIME-Typ für HTML an? Dies wäre nämlich eine andere Möglichkeit mit dem schönen neben Effekt, dass die Mail auch noch besser gestalltet werden kann.

                Kannst du das etwas genauer erklären? Wo kann ich den Typ angeben?

                Mfg
                Simon

                1. Hallo,

                  eigentlich heißt es bei so Fragen immer "Bitte lies das Handbuch GENAU (nicht nur halb". php.net

                  Aber ich gebe dir mal den Code direkt:

                    
                  <?php  
                  $header  = 'MIME-Version: 1.0' . "\r\n";  
                  $header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";  
                  mail($empfaenger, $betreff, $nachricht, $header);  
                  ?>  
                  
                  

                  Gruß
                  mr. php

                  1. Ok, danke.

                    Könntest du mir auch noch vieleicht sagen wie ich das machen kann:

                    z.B.

                    $variable1 =Self;
                    $variable2 =Html;

                    ich möchte diese beiden Variablen in eine $variable_gesamt; geben aber mit einem Leerzeichen zwischen den beiden Variablen. (also so: Self Html)

                    Mfg
                    Simon

                    1. hi,

                      $variable1 =Self;
                      $variable2 =Html;

                      Sind „Self“ und „Html“ fest definiert? Ansonsten dürfte PHP dir einen Error melden, vorausgesetzt, du hast error_reporting auf E_ALL und display_errors auf ON.

                      ich möchte diese beiden Variablen in eine $variable_gesamt; geben aber mit einem Leerzeichen zwischen den beiden Variablen. (also so: Self Html)

                      $variable_gesamt = "$variable1 $variable2";

                      holla holla

                      --
                      Alle Angaben ohne Gewehr.
                      Hey, wenn's dir nicht gefällt, mach neu ...