Ankündigung

Einklappen
Keine Ankündigung bisher.

Kontaktformular - Daten vor dem Absenden überprüfen

Einklappen

Neue Werbung 2019

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

  • Kontaktformular - Daten vor dem Absenden überprüfen

    Hallo,

    ich will mir ein Kontaktformular bauen, bei dem man die eingegeben Daten vor dem Abschicken überprüfen soll. Weiß zufällig jemand ob Spam-Bots zweimal klicken werden?

    Ich hänge an der Übernahme der Daten. Ausgegeben werden sie, nur die Mail ist leer. Wie bekomme ich die Daten in die Mail? Kann mir da bitte jemand helfen?

    Soweit bin ich gekommen:
    PHP-Code:
    <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
      Name:

      <input type="text" name="name">

      Betreff:

      <input type="text" name="betreff">

      E-Mail:

      <input type="text" name="email">

      Nachricht:

      <textarea name="nachricht"></textarea>

      <input type="submit" name="vorschau" value="Vorschau">
    </form>

    <?php
    if ( $_POST["vorschau"] == Vorschau ) { ?>

      Sie haben folgendes eingegeben:

      Name: <?php echo $name ?>

      Betreff: <?php echo $betreff ?>

      E-Mail: <?php echo $email ?>

      Nachricht: <?php echo $nachricht ?>

      <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
        <input type="submit" name="abschicken" value="Abschicken">
      </form>

    <?php }
    if ( 
    $_POST["abschicken"] == Abschicken ) {
      
    mail("email@domain.de"$betreff$nachricht"From: $name <$email>");
      echo 
    "Die Nachricht wurde verschickt!";
    ?>

  • #2
    Sieht nach einem alten Script aus, $name etc. exestieren nur bei aktiviertem register_globals,
    wobei dies möglichst vermieden werden sollte.
    Per $_POST["vorschau"] greifst du doch schon auf das Superglobale Array $_POST zu.
    Warum nicht auch bei den anderen Feldern?
    Das Post Array sammelt alle Eingaben und stellt sie über den im "name"
    Attribut festgelegten Namen zur verfügung.
    <input type="text" name="test" />
    ist also per $_POST['test'] verfügbar.

    Spambots "klicken" übrigens nicht, sondern durchsuchen den Quelltext nach type="submit".
    Man kann also sagen, dass diese Methode nicht vor Spamattacken schützt.
    [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
    — The best things in life aren't things[/FONT]

    Kommentar


    • #3
      Hallo tayke,

      du prüfst bei deinen Abfragen auch nicht auf einen String, sondern eine Konstante. Es muss zunächst

      PHP-Code:
      if ( $_POST['vorschau'] == 'Vorschau' ) { 
      und

      PHP-Code:
      if ( $_POST['abschicken'] == 'Abschicken' ) { 
      lauten. Ob das ein probates Mittel ist SPAM zu verbindern, glaube ich nicht, denn man muss infach nur die "zweite" Seite mit den entsprechenden Parametern aufrufen und das wars. Hier würde ich mit Sessions arbeiten, sprich beim Anzeigen des Formulars eine Session eröffnen und beim Abschicken fragen, ob diese da ist und entsprechende Sicherheits-Codes enthält.

      Ein anderer Weg ist es, die Namen der Formularfelder generisch zu gestalten. Das bedeutet, dass du diese bei jedem Aufruf des Formulars neu vergibst, dann haben es Bots sehr schwer bis unmöglich, dein Formular automatisiert auszunutzen.
      Viele Grüße,
      Dr.E.

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      1. Think about software design [B]before[/B] you start to write code!
      2. Discuss and review it together with [B]experts[/B]!
      3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
      4. Write [I][B]clean and reusable[/B][/I] software only!
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Kommentar


      • #4
        Zitat von phpdummi
        Sieht nach einem alten Script aus...
        Das Skript ist von mir.

        Zitat von phpdummi
        ... $name etc. exestieren nur bei aktiviertem register_globals,
        wobei dies möglichst vermieden werden sollte.
        Per $_POST["vorschau"] greifst du doch schon auf das Superglobale Array $_POST zu.
        Warum nicht auch bei den anderen Feldern?
        Das Post Array sammelt alle Eingaben und stellt sie über den im "name"
        Attribut festgelegten Namen zur verfügung.
        <input type="text" name="test" />
        ist also per $_POST['test'] verfügbar.
        Habs mal geändert... siehe unten.

        Zitat von dr.e.
        Hallo tayke,

        du prüfst bei deinen Abfragen auch nicht auf einen String, sondern eine Konstante. Es muss zunächst

        PHP-Code:
        if ( $_POST['vorschau'] == 'Vorschau' ) { 
        und

        PHP-Code:
        if ( $_POST['abschicken'] == 'Abschicken' ) { 
        lauten.
        Ebenfalls geändert. Soll man einfache Anführungszeichen verwenden? Hab da ja immer die Doppelten.

        Das mit den Sessions hört sich gut an, nur wie kompliziert ist das?

        PHP-Code:
        <?php
        if ( $_POST["vorschau"] == "Vorschau" ) { ?>

          Sie haben folgendes eingegeben:

          Name: <?php echo $_POST["name"]; ?>

          Betreff: <?php echo $_POST["betreff"]; ?>

          E-Mail: <?php echo $_POST["email"]; ?>

          Nachricht: <?php echo $_POST["nachricht"]; ?>

          <form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post" >
            <input type="submit" name="abschicken" value="Abschicken">
          </form>

        <?php }
        if ( 
        $_POST["abschicken"] == "Abschicken" ) {
          
        mail("email@domain.de"$betreff$nachricht"From: $name <$email>");  
          echo 
        "Die Nachricht wurde verschickt!";
        ?>
        Wie muss das denn dann bei mail() aussehen mit dem POST?

        Kommentar


        • #5
          Also erstma stecken nach wie vir noch 2 kleine Fehlerchen drinn:
          PHP-Code:
          mail("email@domain.de"$betreff$nachricht"From: $name <$email>"); 
          muss ebenfalls "$_POSTalisiert" werden (herrlich?! )
          PHP-Code:
          mail("email@domain.de"$_POST['betreff'], $nachricht"From: $_POST['name'] <$_POST['email']>"); 
          Dieses Script läuft aber nur sicher wenn du der Einzige bist, der darüber Emails
          verschickt. Benutzerdaten sollten nämlich NIEMALS direkt, also ungefiltert, übernommen
          werden. Weiteres zu Datenfilterung, Sicherheit etc. findet sich aber hier im Forum
          und per Yahoo (und Google natürlich :wink.
          [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
          — The best things in life aren't things[/FONT]

          Kommentar


          • #6
            Vielleicht solltest Du den Zweck schildern, dem das Script dienen soll. Wie hier schon gesagt, gibt es mehrere sicherheitsrelevante Probleme, z.B.
            - Email-Injection: bei direkter Übernahme von POST Daten können mit Zeilenumbrüchen weitere Headerangaben 'gefälscht'/eingeschleust werden, z.B. durch die Erweiterung der Daten in $_POST['name'] oder $_POST['email']
            - Cross Site Scripting: durch direkte Ausgabe der POST Daten können beliebige Javascripts und Html Daten ausgegeben und bspw. genutzt werden, um Cookiedaten o.ä. auszulesen.
            - natürlich läßt sich auch die eigene Absenderadresse des Eingebenden fälschen
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Zitat von phpdummi
              PHP-Code:
              mail("email@domain.de"$_POST['betreff'], $nachricht"From: $_POST['name'] <$_POST['email']>"); 
              Damit bekomme ich nen Fehler. $nachricht auch muss auch "$_POSTalisiert" werden, oder?
              So kommt kein Fehler, Mail aber weiterhin leer:
              PHP-Code:
              mail("email@domain.de"$_POST['betreff'], $_POST['nachricht'], "From: ".$_POST['name']." <".$_POST['email'].">"); 
              Zitat von phpdummi
              Dieses Script läuft aber nur sicher wenn du der Einzige bist, der darüber Emails
              verschickt. Benutzerdaten sollten nämlich NIEMALS direkt, also ungefiltert, übernommen
              werden. Weiteres zu Datenfilterung, Sicherheit etc. findet sich aber hier im Forum
              und per Yahoo (und Google natürlich :wink.
              Kannst du mir das bitte näher erklären? Das Formular benutze natürlich nicht nur ich.

              Kommentar


              • #8
                Hallo,

                Zitat von nikosch77
                Vielleicht solltest Du den Zweck schildern, dem das Script dienen soll.
                Soll ein öffentliches Kontaktformular für eine Seite werden.

                Zitat von nikosch77
                Wie hier schon gesagt, gibt es mehrere sicherheitsrelevante Probleme, z.B.
                - Email-Injection: bei direkter Übernahme von POST Daten können mit Zeilenumbrüchen weitere Headerangaben 'gefälscht'/eingeschleust werden, z.B. durch die Erweiterung der Daten in $_POST['name'] oder $_POST['email']
                - Cross Site Scripting: durch direkte Ausgabe der POST Daten können beliebige Javascripts und Html Daten ausgegeben und bspw. genutzt werden, um Cookiedaten o.ä. auszulesen.
                - natürlich läßt sich auch die eigene Absenderadresse des Eingebenden fälschen
                Das hört sich alles nicht gut an und noch besser, ich hab davon keine Ahnung. Gibt es vielleicht ein Tutorial, bei dem diese Sachen erklärt werden und ich ein Formular erstellen kann?

                Kommentar


                • #9
                  Grundsätzliches zu Formularen:
                  http://tut.php-q.net/formulare.html

                  Der Sicherheitsaspekt ist ein sehr umfangreiches Thema, das aber schon oft
                  besprochen wurde. Such einfach mal im Internet nach "validieren" von Eingaben.
                  Auch hier im Forum wurde schon darüber gesprochen, benutz einfach mal die
                  Forum-Suche.
                  [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
                  — The best things in life aren't things[/FONT]

                  Kommentar


                  • #10
                    Das ist schon ein kleines Stück Arbeit. Vielleicht kannst Du mit dem 'Affenformular' anfangen (mit register_globals off und Basisvalidierung), Dich in das Thema Sessions einlesen (wohl unverzichtbar für die Captcha Funktionalität) und Dich dann den Sicherheitproblematiken widmen. Bei letzteren macht es bereits viel aus, das Prinzip zu verstehen, Gegenmaßnahmen sind oftmals gar nicht so kompliziert umzusetzen.
                    Auch das PHP Manual bietet unter dem Kapitel Sicherheit bereits einen kleinen Einstieg in die Problematik.

                    Buch zum Einstieg: Kunz/Prochaska - PHP Sicherheit (Probekapitel)
                    einige Infos zu Email Injection
                    einige Infos zu XSS
                    Zu den genannten Angriffsarten läßt sich via Google jede Menge Material finden, auch Tutorials. Nicht zuletzt die Boardsuche hier.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      Zitat von dr.e.
                      Hier würde ich mit Sessions arbeiten, sprich beim Anzeigen des Formulars eine Session eröffnen und beim Abschicken fragen, ob diese da ist und entsprechende Sicherheits-Codes enthält.
                      Geht das mit der Session auch auf einer Seite?

                      Also vielleicht so?
                      PHP-Code:
                      <?php
                      if (isset($_SESSION['sess']) && isset($_POST['abschicken'])) {
                          
                      // Mail abschicken.
                      } else {
                          
                      // Fehler
                      ?>

                      <?php
                      session_start
                      ();
                      $_SESSION['sess'];
                      ?>

                      <form ... >
                        // Formular
                      </form>

                      Kommentar


                      • #12
                        Jetzt überleg nochmal ob die Reihenfolge so Sinn macht? session_start()

                        Kommentar


                        • #13
                          Ok, natürlich sollte session start oben stehen.

                          PHP-Code:
                          <?php
                          session_start
                          ();
                          $_SESSION['sess'];
                          ?>

                          <?php
                          if (isset($_SESSION['sess']) && isset($_POST['abschicken'])) {
                              
                          // Mail abschicken.
                          } else {
                              
                          // Fehler
                          ?>

                          <form ... >
                            // Formular
                          </form>

                          Kommentar


                          • #14
                            $_SESSION['sess'];

                            Wofür soll das denn gut sein?

                            Kommentar


                            • #15
                              hm, ja... eigentlich wollte ich da die Session setzen, aber gut, sie ist leer.
                              Dann legen wir mal einen Wert da rein.

                              Was mir aber gerade auffällt, warum bennötige ich dann überhaupt Sessions?
                              Könnte ja dann auch eine Variable belegen und diese dann überprüfen, oder?

                              Also irgendwas mach ich da falsch. Kannst du mir das bitte mal näher erläutern?

                              Kommentar

                              Lädt...
                              X