1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Tutorial: So mache ich mir mein eigenes Kontaktfomular

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von C.Schwab, 25.07.07.

  1. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Hallo! Bis vor Kurzem war ich noch jemand, der sich ein Kontaktformular über einen Anbieter erstellte. Ich fand jedoch die Werbung immer doof. Nun habe ich mich ein wenig mit PHP beschäftigt und mein eigenes kleines Kontaktformular erstellt - Dies möchte ich euch nun zeigen.

    Zuerst solltet ihr euch erstmal euer Kontaktformular in Forme von html erstellen. Dies kann man wenn man will auch mit einem wysiwyg-Editor machen. Beispiel:

    Es ist nun wichtig, die einzelnen Felder zu benennen. Das Feld indem der Nutzer seinen Namen eingeben muss nennt ihr einfach "name", das indem der Nutzer seine Email eintragen muss nennt ihr "email" und so weiter. Das sieht dann so aus:


    Wichtig ist, dass wir ein Feld mit einer einfachen Matheaufgabe erstellen, um einen Spamschutz zu erhalten. Ich habe in diesem Fall einfach "5+1" benutzt. Nun müssen wir einen Absenderbutton und wahlweise auch einen "Zurücksetzen"-Button hinzufügen:

    Code:
    <p><button name="buttonName" type="submit">Senden</button> <button name="buttonName" type="reset">Zurücksetzen</button></p>
    Unser Formular sieht nun so aus:

    Code:
            <p>Name: <br />
                <input type="text" name="name" size="24" /></p>
            <p>Email:<br />
                <input type="text" name="email" size="24" /></p>
            <p>Nachricht:<br />
                <textarea name="nachricht" rows="4" cols="40"></textarea></p>
    <p>Spamschutz: 5+1<br />
                    <input class="dsR1" type="text" name="spam" size="4" /></p>
            [B]<p><button name="buttonName" type="submit">Senden</button> <button name="buttonName" type="reset">Zurücksetzen</button></p>[/B]
    Jetzt müssen wir eine "Form-Action" reinbringen. Wir benutzen die POST-Methode:

    Code:
    <form action="senden.php" method="post"></form>
    Die PHP-Datei "senden.php" erstellen wir gleich noch. Zwischen das "form"-Tag muss nun das HTML-Formular:

    Code:
    [B]<form action="senden.php" method="post">[/B]<p>Name: <br />
                <input type="text" name="name" size="24" /></p>
            <p>Email:<br />
                <input type="text" name="email" size="24" /></p>
            <p>Nachricht:<br />
                <textarea name="nachricht" rows="4" cols="40"></textarea></p>
    <p>Spamschutz: 5+1<br />
                    <input class="dsR1" type="text" name="spam" size="4" /></p>
            <p><button name="buttonName" type="submit">Senden</button> <button name="buttonName" type="reset">Zurücksetzen</button></p>[B]</form>[/B]
    Die Html-Datei ist nun fertig. Speichert sie unter einem beliebigen Namen ab.
    Nun müssen wir uns an die PHP-Datei "senden.php", über die das Formular versendet und gecheckt wird, heran machen. Diese sieht folgendermaßen aus:

    Wir fangen an, und eröffnen diese mit dem PHP-TAG:

    Code:
    <?php 
    Nun müssen wir den Inhalt, der in das Kontaktformular geschrieben wurde, mittels einer Variable für jedes Feld (In diesem Fall: Name, Email, Nachricht) abfragen. Da wir die POST-Methode verwenden, ist das demnach:

    Code:
    $name = $_POST["name"];
    $email = $_POST["email"];
    $nachricht = $_POST["nachricht"];
    $spam = $_POST["spam"];
    Hierfür sind nämlich die zuvor vergebenen Feldnamen wichtig. Wenn man also beispielsweise noch andere Felder haben möchte, muss man sie 1. in die HTML-Datei einfügen und ihnen einen Namen zuteilen und 2. in der PHP-Datei eine Variable in Forme von "$feldname = $_POST["feldname"];" erstellen.

    Nun kommen wir zu den Bedingungen. Es darf natürlich nicht sein, dass jemand das Formular leer abschickt. Deshalb dürfen wir das Absenden nur möglich machen, wenn 1. Alle Felder ausgefüllt sind und 2. die kleine Matheaufgabe (Schutz vor Spam) stimmt.

    Folgendes geben wir ein, damit überprüft wird, ob in den Feldern etwas eingetragen wurde.

    Code:
    if ($name=="" or $email=="" or $nachricht=="" or $spam=="")
    {
    echo "Du hast nicht alle Felder ausgefüllt! ";
    } 
    Wie man unschwer erkennen kann, werden hier alle unsere 4 Felder auf Inhalt überprüft. Wenn also eines der Felder KEINEN Inhalt hat, wird automatisch eine Fehlermeldung ausgegeben: "echo". Das "or" sagt nur, dass wenn beispielsweise Name und Nachricht Inhalt haben, aber Email kein Inhalt hat, trotzdem die Fehlermeldung ausgegeben wird.

    So sieht unsere PHP-Datei also momentan aus:

    Code:
    <?php
    $name = $_POST["name"];
    $email = $_POST["email"];
    $nachricht = $_POST["nachricht"];
     $spam = $_POST["spam"];
    
    if ($name=="" or $email=="" or $nachricht=="" or $spam=="")
    {
    echo "Du hast nicht alle Felder ausgefüllt! ";
    } 
    
    Jetzt müssen wir überprüfen, ob die Matheaufgabe richtig gelöst wurde (In diesem Tutorial 5+1):

    Code:
    elseif ($spam!="6")
    {
    echo "Du hast die Matheaufgabe falsch gelöst! ";
    }
    
    "elseif" hat hier den Effekt, dass wenn nicht alle Felder ausgefüllt wurden, und obendrein die Matheaufgabe falsch gelöst wurde nicht zwei Fehlermeldungen erscheinen, sondern erstmal nur eine. "$spam!="6")" bedeutet, dass wenn die Zahl NICHT 6 ist, die Fehlermeldung (echo) ausgegeben wird.

    So sieht unsere PHP-Datei also jetzt aus:

    Code:
    <?php
    $name = $_POST["name"];
     $email = $_POST["email"];
     $nachricht = $_POST["nachricht"];
      $spam = $_POST["spam"];
    
    if ($name=="" or $email=="" or $nachricht=="" or $spam=="")
     {
     echo "Du hast nicht alle Felder ausgefüllt! ";
     } 
    
    elseif ($spam!="6")
    {
    echo "Du hast die Matheaufgabe falsch gelöst! ";
    }
    
    Nun haben wir alle Bedingungen definiert. "if" oder "elseif" = Bedingung. Wenn also die Matheaufgabe gelöst wurde und alle Felder ausgefüllt wurden, kann das Formular verschickt werden. Wie folgt:
    Code:
    else
    {
    $mail_empfaenger="DEINEEMAIL";
    $mail_absender="ABSENDER";
    $betreff="BETREFF";
    $text="Name: $name \n
    Email: $email \n
    Nachricht: $nachricht"; 
    mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
    echo "Danke für die Kontaktanfrage. Ich werde diese so schnell wie möglich bearbeiten.";
    }
    "else" sagt uns nun: AHA! Alle Bedingungen wurden erfüllt, jetzt kann die Mail verschickt werden. Wir bilden die Variablen "mail_empfaenger", "mail_absender", "betreff" und "text". Dann verschicken wir diese Variablen mit dem "mail"-Befehl. Alles was ich in diesem Code groß geschrieben habe, muss du nun nur noch durch deine Sachen ersetzen. "echo" gibt bei erfolgreichem Versand eine Meldung aus. Diese kannst du auch anpassen, wie du möchtest.

    Unsere PHP-Datei sieht nun so aus:

    Code:
    <?php
    $name = $_POST["name"];
     $email = $_POST["email"];
     $nachricht = $_POST["nachricht"];
      $spam = $_POST["spam"];
    
    if ($name=="" or $email=="" or $nachricht=="" or $spam=="")
     {
     echo "Du hast nicht alle Felder ausgefüllt! ";
     } 
    
    elseif ($spam!="6")
     {
     echo "Du hast die Matheaufgabe falsch gelöst! ";
     }
    
    else
    {
    $mail_empfaenger="DEINEEMAIL";
    $mail_absender="ABSENDER";
    $betreff="BETREFF";
    $text="Name: $name \n
    Email: $email \n
    Nachricht: $nachricht"; 
    mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
    echo "Danke für die Kontaktanfrage. Ich werde diese so schnell wie möglich bearbeiten.";
    }
     
    Zum Schluss schließen wir das PHP-TAG noch ab:
    Code:
    ?>
    ..und die PHP-Datei ist fertig:

    Code:
    <?php
    $name = $_POST["name"];
     $email = $_POST["email"];
     $nachricht = $_POST["nachricht"];
      $spam = $_POST["spam"];
    
    if ($name=="" or $email=="" or $nachricht=="" or $spam=="")
     {
     echo "Du hast nicht alle Felder ausgefüllt! ";
     } 
     
     elseif ($spam!="6")
      {
      echo "Du hast die Matheaufgabe falsch gelöst! ";
      }
    
    else
     {
     $mail_empfaenger="DEINEEMAIL";
     $mail_absender="ABSENDER";
     $betreff="BETREFF";
     $text="Name: $name \n
     Email: $email \n
     Nachricht: $nachricht"; 
     mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
     echo "Danke für die Kontaktanfrage. Ich werde diese so schnell wie möglich bearbeiten.";
     }
    ?>
    Diese speichern wir nun unter "senden.php" ab. Jetzt laden wir die PHP, sowie die HTML-Datei auf unseren Server. Wenn wir nun die HTML-Datei aufrufen, das Kontakt ausfüllen und abschicken, sollte es einwandfrei funktionieren.

    Ich hoffe ich habe bei meinem ersten Tutorial nicht allzu große Fehler gemacht. Ich habe vor zwei Tagen mit PHP angefangen. Wenn ihr Lust habt könnt ihr es ja mal probieren und mir Feedback geben.
     
    #1 C.Schwab, 25.07.07
    Zuletzt bearbeitet: 25.07.07
  2. Nathea

    Nathea Admin
    AT Administration

    Dabei seit:
    29.08.04
    Beiträge:
    13.559
    Tolle Beschreibung, danke dafür. Werde ich in den nächsten Tagen mal selbst testen.

    Was toll wäre: Du hast nicht zufällig ein solches Formular, quasi als "lebendiges Beispiel für Deinen Code", irgendwo auf einer Webseite abgelegt? Das würde dem Tutorial den letzten Schliff geben.

    Lieben Gruß,
    Nathea
     
  3. Hobbes_

    Hobbes_ Gast

    Vielen Dank für Dein Tutorial. Wirklich sehr schön geschrieben - und das nach 2 Tagen PHP. Wirklich schön.

    Ich möchte nur auf einen Aspekt noch hinweisen, der zu kurz kommt: Die Sicherheit.

    Benutzereingaben dürfen NIE einfach vewendet werden. Dies gilt für alle Parameter (POST, GET, COOKIES, SESSION,...). Immer musst Du VOR der Verwendung und VOR Ausgabe überprüfen, dass die Parameter keinen Schaden auf Deinem Server und auch keinen Schaden auf dem folgenden Client anrichten (siehe auch cross site scripting, XSS). Zu Beginn würde man sich nie vorstellen, wie falsch man Parameter verwenden kann und so einen Computer tatsächlich schachmatt setzen kann.

    Deshalb: Alle hereinkommenden Parameter prüfen, ob sie wirklich den verlangten Spezifikationen entsprechen. Ich kontrolliere für mich genau, ob eine Zahl beispielsweise eine Zahl und ob sie sogar im vorgegebenen Range ist, ich kontrolliere Boolean für Boolean und Strings, dass sie nicht etwa falsche Zeichen enthalten (dies dann insbesondere auch, wenn es um Dateinamen geht)...

    Ein guter Start stellt schon mal htmlspecialchars() dar, mit dem wenigstens alle HTML-Spezialzeichen umgewandelt werden, so dass Dir nicht plötzlich jemand eine javascript enthaltende Nachricht schicken kann, die doch einiges unangenehmes tun kann.

    Eingaben müssen vor SQL ebenso escaped werden (siehe auch bei MySQL Spezialbefehle).

    Leider sind auch viele Beispiele in Anfängerbüchern und Tutorials diesbezüglich falsch, dass sie dies nicht erwähnen. Da wähnt man sich in falscher Sicherheit. Doch muss man sich immer bewusst sein, dass man keine Ahnung hat, in welcher Form die Parameter ankommen. man ist selbst ja nicht der einzige Benutzer und das Porgramm läuft nicht geschützt auf dem eigenen Computer, sondern frei erreichbar im Internet.

    Ansonsten sehr schön gemacht.
     
  4. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Danke, daß Du Dir die Arbeit gemacht hast ein Tutorial zu erstellen. Ich muß jedoch gestehen, daß es nicht zu mehr als einem Programmierbeispiel taugt, da ich es aus Sicherheitsgründen nicht auf einem Produktivsystem einsetzen würde.
    Ein Spammer wird sofort mitbekommen, daß die Matheaufgabe immer die selbe ist, und den Parameter einfach mit übergeben. Diese Leute sind nicht dumm.

    Zur bereits angesprochenen Sicherheit:
    Du überprüfst keinen einzigen Parameter. Auch nicht, ob die eMail Adresse überhaupt eine eMail Adresse ist, oder auch nur ansatzweise eine eMail Adresse sein könnte. Geschweige denn RFC822 Konformität.

    Zur HTML Ausgabe:
    Du schickst diakritische Zeichen (in Deinem Fall Umlaute) ohne HTLM Entity Encoding.

    Zu den Variablen:
    Es ist keine gute Idee Variablennamen in nicht-englischer Sprache zu benennen. Falls sich irgendjemand anderer auf der Welt jemals Deinen Code ansehen soll, dann sind lokalisierte Variablennamen sehr hinderlich wenns um das Verständnis des Codes geht. Daher sollte man hier immer englische Bezeichnungen verwenden.

    Die Variable $betreff kommt aus dem Nichts, wird nie gesetzt und könnte potentiell dazu missbraucht werden die anderen Variablen zu überschreiben. Ebenso finde ich nicht wo $mail_absender den Wert von $email zugewiesen bekommt.

    In der Nachricht kann ich jeden (bösartigen) Inhalt übergeben. Von JavaScript über HTML bist hin zu SQL Statements würde alles durchgehen und exakt auch so versendet werden. Du bringst dadurch Dich selbst als Empfänger der Nachrichten in Gefahr. Wenn es jemand schafft die $mail_empfaenger Variable erfolgreich zu überschreiben, dann kann er an jede beliebige Adresse ein solches eMail versenden. Das willst Du nicht.

    Da es als Tutorial ja beschrieben ist sei nur am Rande darauf hingewiesen, daß der PHP Code keinerlei Kommentare enthält. Guter Programmcode ist (sprachagnostisch) auch gut kommentiert, damit andere (und man selbst) ihn (auch nach 3 Wochen noch) verstehen können.


    Fazit: Für den Produktionseinsatz ungeeignet weil viel zu gefährlich. Bitte sieh dies als gut gemeinte Kritik an. Du ersparst Dir und den anderen möglichen Anwendern Deines Codes, daß deren Webseiten massiv zum Spammen missbraucht werden können.
    Gruß Pepi
     
  5. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Hallo. Danke für das Feedback. Hätte gedacht mit der einfachen Matheaufgabe würde das hinhauen. Also werde ich das Tutorial abändern - muss mir nur noch durchlesen wie :). Ich werde das Kästchen Email auf ein "@" überprüfen lassen. - Hättet ihr noch Ideen? Man könnte ja bei Name nur "abcdefghijklmnopqrstuvwxyz" zu lassen, und bei Nachricht "abcdefghijklmnopqrstuvwxyz . , () !" - Würde das gehen? Bei der Maheaufgabe muss ich es so machen, dass immer eine neue erscheint.

    Danke.
     
  6. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Eine eMail Adresse besteht aus mehr als nur einem "@". Schau Dich mal bei einschlägigen PHP Code Quellen um nach einem eMail Validator oder einem RFC822 Checker. Du machst Dir unnötige Arbeit indem Du das Rad versuchst nochmal zu erfinden. Das Problem wurde schon mehrfach gelöst und sicherlich umfangreicher und besser als Du es in den nächsten vier Wochen ausprogrammieren könntest. Ich will Dich nicht explizit davon abhalten, aber es ist unnötiger Schweiß.

    Was ist mit Namen die einen Umlaut enthalten? Oder mit anderssprachigen Namen die Zeichen enthalten die Du vielleicht garnicht kennst? Und ich rede jetzt noch nichtmal von asiatischen, kyrillischen oder griechischen Schriftsystemen.

    Wozu willst Du überhaupt Deine Benutzer mit einer Matheaufgabe quälen? Als automatisierter Turing Test taugt das ganze nämlich nicht und macht es der Zielgruppe, nämlich den Menschen nur unnötig schwieriger Dein Formular zu benutzen. ("Wie komme ich als User dazu sowas eingeben zu müssen?")

    Wenn Du sehr konkret verhindern kannst, daß Dein Formular zum beliebigen spammen misbraucht werden kann, ergibt sich diese Notwendigkeit garnicht erst. Sinnvoller ist es die Anzahl der Absendungen über Zeit zu limitieren. Kein Mensch wird Dir 17 Nachrichten innerhalb einer Minute schicken, ein Skript schon eher.

    Sieh das ganze eher als Lernbeispiel denn als Produktionsentwicklung an. Schau Dir evt. auch einige andere solcher Formulare an und lerne von deren Implementationen. Es ist auch immer ein guter Gedanke sich zu überlegen wie man seinen eigenen Code überlisten könnte. So findet man oft zumindest die gröbsten klaffenden Sicherheitslücken. Den Rest finden die anderen.
    Gruß Pepi
     
  7. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Kurz gefragt: Können Spambots auch Dropdown-Menüs nutzen? Also wenn ich schreibe "5+1" und dann Auswahlmöglichkeiten dahinsetze?
     
  8. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    So. Ich habe jetzt den Spamschutz aktiv, und eine Überprüfung der Email reingebaut. Dafür müssen wir aber die HTML-Datei in eine PHP-Datei umwandeln.

    So sieht die PHP-Datei mit Formular aus:

    Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <?php
    [B]$Zahl_1 = intval(rand(1, 5));
    $Zahl_2 = intval(rand(1, 5));[/B]
    ?>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    
        <head>
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />
            <meta name="generator" content="Adobe GoLive" />
            <title>Unbenannte Seite</title>
            <style type="text/css" media="all"><!--
    #spam2 { width: 32px; height: auto; }
    --></style>
        </head>
    
        <body>
            <p><form action="senden.php" method="post"><p>Name: <br />
                <input type="text" name="name" size="24" /></p>
            <p>Email:<br />
                <input type="text" name="email" size="24" /></p>
            <p>Nachricht:<br />
                <textarea name="nachricht" rows="4" cols="40"></textarea></p>
    [B]<p>Spamschutz: <?php echo $Zahl_1; ?>+<?php echo $Zahl_2; ?><br />
                    <input name="spam" type="hidden" id="spam"  value="<?php echo md5(( $Zahl_1 + $Zahl_2 )); ?>"/>
    <input name="spam2" type="text" id="spam2" size="3"/></p>[/B]
            <p><button name="buttonName" type="submit">Senden</button> <button name="buttonName" type="reset">Zurücksetzen</button></p></form></p>
        </body>
    
    </html>
    Oben haben wir nun zwei Variablen um 2 Zahlen zu erstellen. das heißt es wird immer unterschiedlich eine Zahl vom 1-5 gewählt. Unten haben wir nun ein verstecktes Feld (spam), wo Zahl und Zahl automatisch zusammengerechnet werden. Dann muss der Besucher das Ergebnis der Aufgabe im Textfeld "spam2" eingeben. am Ende wird in der "senden.php" überprüft, ob spam und spam2 identisch sind.

    So sieht unsere senden.php nun aus:
    Code:
    <?php
    $name = $_POST["name"];
    $email = $_POST["email"];
    $nachricht = $_POST["nachricht"];
    
    
    if ($email=="" or $name=="" or $nachricht=="")
    {
    echo "Sie haben nicht alle Pflichtfelder ausgefüllt! ";
    } 
    
    [B]elseif (!ereg ("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $_POST['email']))
    {
    echo "Bitte überprüfen Sie Ihre Email";
    }[/B]
    
    [B]elseif ($_POST['spam'] != md5($_POST['spam2']))
     {
      echo "Du hast die Matheaufgabe falsch gelöst! ";
      }[/B]
    
    else
     {
     $mail_empfaenger="DEINEEMAIL";
     $mail_absender="ABSENDER";
     $betreff="BETREFF";
     $text="Name: $name \n
     Email: $email \n
     Nachricht: $nachricht"; 
     mail($mail_empfaenger, $betreff, $text,"from:$mail_absender");
     echo "Danke für die Kontaktanfrage. Ich werde diese so schnell wie möglich bearbeiten.";
     }
    ?>
    Dort werden nun die eingegebenen Zeichen im Feld "Email" überprüft, und ob die Felder "spam2 und "spam2" den gleichen Inhalt haben.

    Hier hab ich das Formular mal hochgeladen (Bitte keine Spamattacken ausprobieren) :D: www.sj29-chat.de/tut.php

    Jetzt muss ich nur noch irgendwie die beiden anderen Felder überprüfen lassen. Jemand Ideen?
     
  9. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Sagen wir mal, daß Du Dir das so vorstellen darfst. Technisch funktioniert es anders, aber alles was auf der Webseite drauf ist, und von einem Menschen an Dein Formular geschickt werden kann, kann ich auch programmatisch dorthin schicken. Technisch betrachtet kann ich damit sogar mal ganz locker Client-seitige Plausibilitätsüberprüfungen einfach so umgehen. Daraus folgt, daß man niemals dem was man geschickt bekommt trauen darf, und schon überhautp garnicht irgendwelche Annahmen über den Inhalt implizieren darf.


    Deine eMail Überprüfung ist leider mehr als unzureichend. Sie läßt definitiv nicht alle zulässigen eMail Adressen durch und blockiert gleichzeitig nicht alles was definitiv keine eMail Adresse ist. Mein Hinweis Dich um einen vollständigen RFC822 Checker umzusehen habe ich ernst gemeint.
    Hinweis: Legale IDN-Domains läßt Du nicht durch, Top Level Domains können nicht nur 2 oder 3 Zeichen lang sein.

    Hältst Du es für eine gute Idee das Ergebnis Deiner Frage auch gleich in die Webseite einzubauen? Ich muß nur einfach den Inhalt von dem einen Feld auch im anderen übergeben um Dein Formular auszutricksen. Dazu muß ich nichtmal irgendwelche Berechnungen durchführen, da ich das Ergebnis ja schon von Dir fix fertig frei Haus geliefert bekomme. Ich könnte sie sogar einfach immer beide als 0 übergeben, 0 ist immer = 0, wie praktisch. Dann muß ich nichmal mehr auslesen was Du für eine Frage samt Antwort lieferst, sondern ich liefere als pöhser Spammer gleich immer eine Antwort die als gültig erkannt wird. Auch die MD5 Summen kannn ich da gleich mitübergeben.

    Traue niemals dem was Du von einem Formular bekommst...

    Warum sollen wir keine Spamattacken ausprobieren? Glaubst Du ein echter Spammer berücksichtigt, daß Du daneben stehen hast "Bitte nicht missbrauchen"? :)

    Klingt jetzt alles ein wenig hart, die Realität ist aber unter Umständen noch härter und vor allem Rücksichtslos.
    Gruß Pepi
     
  10. stk

    stk Grünapfel

    Dabei seit:
    05.01.04
    Beiträge:
    7.141
    Moin,

    mal als Tipp am Rande, auch wenn es schon etwas in die "gehobene" Programmierung geht: über pear.php.net bekommst Du hübsche, fertige Klassen, die Dir einiges an Eigenentwicklung - z.B. beim Aufbau von Formularen, Tests von Parametern, etc. ersparen.

    Gruß Stefan
     
  11. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Wie kommt ein Spammer denn an den Inhalt des versteckten Feldes?
     
  12. C.Schwab

    C.Schwab Finkenwerder Herbstprinz

    Dabei seit:
    24.06.07
    Beiträge:
    470
    Was sagt ihr hierzu. Das Script habe ich mir heruntergeladen und soll sicher sein (Daher auch der Trick mit der Matheaufgabe).
    Code:
    <?php
    
    // Wenn alle Felder ausgefuellt wurden und der Captcha stimmt, wird ein Cookie gesetzt
    
    if($_GET['action'] != "" && !empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) && ereg ("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $_POST['email']))
    {
    setcookie("spam_protection", "spam_protection", time()+500);
    }
    
    // Erstellen einer Rechenaufgabe
    
    $Zahl_1 = intval(rand(1, 5));
    $Zahl_2 = intval(rand(1, 5));
    
    ?>
    
    <!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-Script-Type" content="text/javascript" />
    <title>Kontaktformular</title></head>
    
    <body>
    
    <?php
    
    // Wenn das Formular gesendet werden soll...
    if($_GET['action'] == "send")
    {
    
    // ...der Cookie gegen Spam nicht gesetzt ist...
    if($_COOKIE["spam_protection"] != "spam_protection")
    {
    
    // ... und die Rechenaufgabe FALSCH geloest wurde...
    if($_POST['number'] != md5($_POST['arithmetic']))
    {
    
    // ...dann eine Fehlermeldung ausgeben!
    echo "<p><img src=\"stop.gif\" width=\"20\" height=\"20\" alt=\"Fehler\" /> <font style=\"color:darkred; font-family:Geneva, Arial, Helvetica, sans-serif; font-size:16px\"><b>Die Rechenaufgabe wurde falsch gel&ouml;st!</b></font></p>";
    
    }
    
    // Ansonsten, wenn die Rechenaufgabe RICHTIG geloest wurde stimmt...
    if($_POST['number'] == md5($_POST['arithmetic']))
    {
    
    // ...und die eingegeben E-Mail Adresse in Wahrheit keine ist...
    if(!ereg ("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $_POST['email']))
    {
    
    // ...dann eine Fehlermeldung ausgeben!
    echo "<p><img src=\"stop.gif\" width=\"20\" height=\"20\" alt=\"Fehler\" /> <font style=\"color:darkred; font-family:Geneva, Arial, Helvetica, sans-serif; font-size:16px\"><b>Die eingegebene E-Mail-Adresse ist ung&uuml;ltig!</b></font></p>";
    
    }
    
    // Ansonsten, wenn die eingegebene E-Mail Adresse auch wirklich eine ist...
    if(ereg ("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$", $_POST['email']))
    {
    
    // ...und kein Feld leer ist...
    if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']))
    {
    
    // dann den ganzen Muell von Spambots oder auch menschlichen Spammern entfernen...
    $name          = nl2br(stripslashes(htmlspecialchars($_POST['name'])));
    $IP            = getenv("REMOTE_ADDR");
    
    $absender      = preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "", $_POST['email'] );
    $absender      = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $absender );
    
    $nachricht     = nl2br(stripslashes(htmlspecialchars($_POST['message'])));
    
    // ...die Nachricht, die Sie erhalten moechten, wenn eine neue Nachricht an Sie versandt wurde, definieren...
    $mailnachricht = "Hallo!\n\nEs ist eine neue Nachricht fuer Sie eingetroffen:\n\n---------------------------------------------\n\nName:\n$name\n\nIP:\n$IP\n\nE-Mail:\n$absender\n\nNachricht:\n$nachricht\n\n---------------------------------------------\n\nSie koennen dem Absender der Nachricht direkt antworten, indem Sie einfach auf diese E-Mail antworten.\n\nMfG\nBotty ;-)";
    
    // ...an Sie verschicken...
    mail("Ihre@E-Mail.de", "Neue Nachricht fuer Sie!", $mailnachricht, "From: $name <$absender>");
    
    // ...und dem Benutzer sagen, dass alles glatt lief!
    echo "<p><img src=\"ok.gif\" width=\"20\" height=\"20\" alt=\"Okay\" /> <font style=\"color:darkgreen; font-family:Geneva, Arial, Helvetica, sans-serif; font-size:16px\"><b>Vielen Dank f&uuml;r Ihre Nachricht!</b> Wir lassen Ihnen umgehend eine Antwort zukommen.</font></p>";
    
    }
    
    // Wenn nicht alle Felder ausgefuellt wurden, dann...
    else
    
    {
    
    // eine Fehlermeldung ausgeben!
    echo "<p><img src=\"stop.gif\" width=\"20\" height=\"20\" alt=\"Fehler\" /> <font style=\"color:darkred; font-family:Geneva, Arial, Helvetica, sans-serif; font-size:16px\"><b>Bitte f&uuml;llen Sie alle Felder aus!</b></font></p>";
    
    }
    
    }
    
    }
    
    }
    
    }
    
    ?>
    
    <form id="form" name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?action=send">
    
    <table width="400" cellpadding="2" cellspacing="2" style="background-color:#E6E6E6; font-family:Geneva, Arial, Helvetica, sans-serif; font-size:12px">
    
    <tr>
    
    <td width="162" style="background-image: url(hintergrund.jpg)">
    <strong>Ihr Name</strong></td>
    
    <td width="188">
    
    <input name="name" type="text" id="name" style="background-color:#CCCCCC; font-size:12px; font-family:Geneva, Arial, Helvetica, sans-serif; border : 1px solid #000000; width:186px" value="<?php echo $_POST['name']; ?>"/></td>
    <td width="28" align="center" valign="middle"><img src="hilfeicon.gif" alt="Hilfe" width="15" height="15" title="Bitte geben Sie Ihren Namen an, damit wir Sie pers&ouml;nlich ansprechen k&ouml;nnen!" /></td>
    </tr>
    
    <tr>
    
    <td width="162" style="background-image: url(hintergrund.jpg)">
    <strong>Ihre g&uuml;ltige E-Mail Adresse</strong></td>
    
    <td width="188">
    
    <input name="email" type="text" id="email" style="background-color:#CCCCCC; font-size:12px; font-family:Geneva, Arial, Helvetica, sans-serif; border : 1px solid #000000; width:186px" value="<?php echo $_POST['email']; ?>"/></td>
    <td width="28" align="center" valign="middle"><img src="hilfeicon.gif" alt="Hilfe" width="15" height="15" title="Ihre aktuelle, g&uuml;ltige E-Mail Adresse, an der wir Ihnen antworten!" /></td>
    </tr>
    
    <tr>
    
    <td width="162" style="background-image: url(hintergrund.jpg)">
    <strong>Ihre Nachricht</strong></td>
    
    <td width="188">
    
    <textarea name="message" id="message" style="background-color:#CCCCCC; font-size:12px; font-family:Geneva, Arial, Helvetica, sans-serif; border : 1px solid #000000; width:186px; height:100px" rows="4" cols="15"><?php echo $_POST['message']; ?></textarea></td>
    <td width="28" align="center" valign="middle"><img src="hilfeicon.gif" alt="Hilfe" width="15" height="15" title="Bitte formulieren Sie Ihr Anliegen m&ouml;glichst detailliert!" />
    
    </td>
    
    </tr>
    
    <tr>
    
    <td width="162" style="background-image: url(hintergrund.jpg)">
    
    <strong>Wieviel ist <?php echo $Zahl_1; ?> plus <?php echo $Zahl_2; ?>?</strong>
    
    </td>
    
    <td>
    
    <input name="number" type="hidden" id="number"  value="<?php echo md5(( $Zahl_1 + $Zahl_2 )); ?>"/>
    <input name="arithmetic" type="text" id="arithmetic" style="background-color:#CCCCCC; font-size:12px; font-family:Geneva, Arial, Helvetica, sans-serif; border : 1px solid #000000; width:186px" onfocus="if(this.value=='Das Ergebnis bitte hier hinein...')this.value=''" onblur="if(this.value=='')this.value='Das Ergebnis bitte hier hinein...'" value="Das Ergebnis bitte hier hinein..."/>
    
    </td>
    
    <td align="center" valign="middle">
    
    <img src="hilfeicon.gif" alt="Hilfe" width="15" height="15" title="Spamschutz: Addieren Sie bitte <?php echo $Zahl_1; ?> und <?php echo $Zahl_2; ?> und schreiben Sie deren Summe in das Textfeld." />
    
    </td>
    
    </tr>
    
    <tr>
    
    <td style="background-image: url(hintergrund.jpg)">
    <strong>M&ouml;gliche Aktionen</strong>
    </td>
    
    <td>
    
    <?php
    
    // Wenn KEIN Cookie gegen Spam gesetzt wurde, dann soll der "Senden"-Button anklickbar sein
    if($_COOKIE["spam_protection"] != "spam_protection")
    {
    
    ?>
    
    <input name="submit" type="submit" id="submit" value="Senden" /> <input name="reset" type="reset" id="reset" value="Zur&uuml;cksetzen" />
    
    <?php
    
    }
    
    // Wenn aber ein Cookie gegen Spam gesetzt wurde, dann soll der "Senden"-Button blockiert werden
    if($_COOKIE["spam_protection"] == "spam_protection")
    {
    
    ?>
    
    <input name="submit" type="submit" id="submit" value="Senden" disabled="true" /> <input name="reset" type="reset" id="reset" value="Zur&uuml;cksetzen" />
    
    <?php
    
    }
    
    ?>
    
    </td>
    
    <td align="center" valign="middle"><img src="hilfeicon.gif" alt="Hilfe" width="15" height="15" title="Sie k&ouml;nnen das Formular absenden oder zur&uuml;cksetzen!" /></td>
    
    </tr>
    
    <tr>
    
    <td style="background-image: url(hintergrund.jpg)"><strong>Sie ben&ouml;tigen Hilfe? </strong></td>
    <td colspan="2">Mit dem Mauszeiger auf das Fragezeichen zeigen und Hilfe naht :-)</td>
    
    </tr>
      
    </table>
    
    </form>
    
    </body>
    
    </html>
     
  13. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Ich habe das obige Skript nicht getestet, aber aus Erfahrung mit Gewinnspiel-Teilnahme-Formularen und der Tatsache, dass Firmen wie gewinnspiele.de Teilnehmer tausendfach automatisiert in das Formular pumpen wollen und andere ungewollte Nutzungen probieren, hilft eigentlich nur ein CAPTCHA (lesenswert, da ausführlicher auch die englische Variante). Cookies helfen nicht wirklich, Rechenaufgaben und dergleichen sind meist komplizierter in der Implementierung.
     
  14. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Indem er sich den HTML-Code anschaut.
     
  15. Irgendein Held

    Irgendein Held Oberösterreichischer Brünerling

    Dabei seit:
    17.06.07
    Beiträge:
    714
    Tags solltest du auch rausstrippen.
    <marquee> z.B. ;)

    Die Strukturiering klappt ja, allerdings kommt jetzt die Arbeit mit der Sicherheit.
    Und da musst du ein wenig um die Ecke denken.
     

Diese Seite empfehlen