Ankündigung

Einklappen
Keine Ankündigung bisher.

Formularmissbrauch

Einklappen

Neue Werbung 2019

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

  • Formularmissbrauch

    Hallo an alle,

    ich habe seit Freitag das Problem, dass mein Kontaktformular auf meiner Website missbraucht wird, d.h. dass Spammails darüber abgeschickt werden.
    Kennt Ihr das Problem und könnt Ihr mir helfen, dies zu verhindern?

    Zum besseren Verständnis mein Code:
    PHP-Code:
     <?php
    $name 
    $_POST['name'];
    $email $_POST['email'];
    $nachricht $_POST['nachricht'];
            
    $Fehler="N";
    if (
    $name == ""){ $Fehler="Y"; }
    if (
    $name == "Bitte ausfuellen"){ $Fehler="Y"; }
    if (
    $nachricht == ""){ $Fehler="Y"; }
    if (
    $nachricht == "#"){ $Fehler="Y"; }
    if (
    $email == ""){ $Fehler="Y"; }
    if (
    $email == "Bitte ausfuellen"){ $Fehler="Y"; }
    if (!
    strstr($_POST['email'],"@") && $_POST['email'] != "Bitte ausfuellen" && $email != "") { $Fehler "Y"$_POST['email']="Keine gültige E-Mail-Adresse"; }
    if (!
    strstr($_POST['email'],".") && $_POST['email'] != "Bitte ausfuellen" && $email != "") { $Fehler "Y"$_POST['email']="Keine gültige E-Mail-Adresse"; }
            
    if (
    eregi('Content-Type:'$name)) { $Fehler "Y"; }
    if (
    eregi('Content-Type:'$email)) { $Fehler "Y"; }
            
    if ( (
    strstr($name"\n") != false) || (strstr($name"\r") != false) ) { $Fehler "Y"; }
    if ( (
    strstr($email"\n") != false) || (strstr($email"\r") != false) ) { $Fehler "Y"; }
        
            
    // wenn keine Fehler auftreten, d.h. alle Eingaben richtig sind und alle Pflichtfelder ausgefüllt sind, werden Daten nochmal ausgegeben
        
    if ($Fehler == "N")
        {
        
    //Auswerten der Eingabe 
        
            
    $datum date("d.m.Y");
            
    $uhrzeit date("H:i");
            
    $betreff "Nachricht von Website";

             
    $mailtext "";
             
    $mailtext .="Folgende Nachricht wurde";
             
    $mailtext .=" von " .$name." abgeschickt: \n\n";
             
    $mailtext .=$nachricht;
            
             
    mail("test@test.de"$betreff$mailtext"From: $email");
             
             
             echo 
    "Vielen Dank f&uuml;r Ihre Nachricht. Ich setze mich schnellstm&ouml;glich mit Ihnen in Verbindung.";
        }

  • #2
    1) was heißt spam ? du bekommst spam, oder wird über dein formular an andere Spam verschickt ? so wie ich den Code sehe, wohl Spam an dich oder ? weis ja nicht was du da alles verändert hast

    2) vieleicht auch mal den coe des formulars posten.

    Zum eigentlichen Problem gibt es verschiedene Lösungen, eine wäre sogenannte Captchas einzubauen: http://de.wikipedia.org/wiki/CAPTCHA

    eine weitere wäre recht simpel, ein weitere Feld in dein Formular, wo du dazuschreibst, was in das feld eingetragen werden muss, z.b. machst du ein bild von irgendwas nebendran und man muss das tier reinschreiben was da drauf ist, oder eine kleine mathematische aufgabe oder sowas.

    mfg
    robo47

    Kommentar


    • #3
      Hallo,

      danke für die schnelle Antwort.
      Ich bekomme Mails mit folgendem Inhalt:
      "Folgende Nachricht wurde von and511@meinedomain.de abgeschickt:

      ollar
      Content-Transfer-Encoding: base64
      Content-Type: text/plain
      X-Mailer: Internet Mail Service (5.5.2650.21)
      Subject: quantity of
      cc: dinotto2@aol.com
      cc: ruth10a@aol.com
      cc: rvdsteeg@aol.com
      cc: reinderswolf@aol.com
      cc: kaihsorensen@aol.com
      cc: grammievi@aol.com

      YmFrZWQuIG9pbGVkIGJhY29uIGFuZCBjYWJiYWdlIGEgdHJhZG l0aW9uYWwgcmlzaCByZWNpcGUg
      dXNlcyBhIGdhbW1vbiBqb2ludC4gYXNoZXJzIG9mIGJhY29uIG FyZSBhIG1haW4gY29uc3RpdHVl
      bnQgb2YgdGhlIHRyYWRpdGlvbmFsIHJpc2ggYnJlYWtmYXN0LC BhbG9uZw==

      3c32bb71c8e56f6547570ee875c774f8"

      Mein Formular ist ganz einfach aufgebaut:
      Code:
      <form action="formmailer.php" method="post" name="form1">
      Name:<input name="name" type="text" id="name" size="27" class="formular">
      
      
      
      E-Mail:<input name="email" type="text" id="email" size="27" class="formular">
      
      
      
      Nachricht:
      
      <textarea type="text" name="nachricht" id="nachricht" cols="26" rows="4" class="formular"></textarea>
      
      
      <input type="submit" value="Senden" name="Send">
      <input type="reset" value="Zur&uuml;cksetzen" name="Reset">
      </form>
      Das mit den Captchas habe ich schonmal gelesen. Doch ich finde diese Variante nicht unbedingt schön.

      Es muss doch eine Variante geben, mit der ich meinen Code verändere und sicher mache?

      Kommentar


      • #4
        Ist doch ein klassisches Scheunentor, das du da offen lässt.

        Lies mal z.B. das hier:
        http://www.securephpwiki.com/index.php/Email_Injection

        Und, bevor sie im Nirvana verschwinden, sicher dir die Server-Logfiles seit Freitag.

        Basti

        Kommentar


        • #5
          Sorry, ich stelle mich gerade dumm an.
          Es handelt sich also um Email-Injection..
          Ist es also ausreichend, dass ich folgenden Code bei mir einbaue?
          PHP-Code:
          <?php 
             $from 
          $_POST["sender"];
             
          $from urldecode($from);
             if (
          eregi("\r",$from) || eregi("\n",$from)){
               die(
          "Why ?? :(");
             }
           
          ?>
          Doch ich dachte, dass habe ich schon im Code stehen?

          Kommentar


          • #6
            Zitat von Lia
            Es handelt sich also um Email-Injection..
            Jo.

            Ist es also ausreichend, dass ich folgenden Code bei mir einbaue?
            PHP-Code:
            <?php 
               $from 
            $_POST["sender"];
               
            $from urldecode($from);
               if (
            eregi("\r",$from) || eregi("\n",$from)){
                 die(
            "Why ?? :(");
               }
             
            ?>
            Ich meine schon. Ich überprüfe den Wert der mir als Absender übergeben wird immer mit PEAR::Mail und hab mich daher noc nicht mit allen Angriffsmöglichkeiten beschäftigt. Allerdings solltest du strpos() anstatt eregi() verwenden. Die ereg-Funktionen solltest du eh vergessen und anstatt dessen die PCREs benutzen (falls einfach String-Funktionen, wie str_replace() nict ausreichen).

            Doch ich dachte, dass habe ich schon im Code stehen?
            Huch? Schau doch einfach nach. *g

            Je nach verwendetem Mailer werden auch kodierte Zeilenumbrüche (%0D bzw. %0A) akzeptiert. Daher das urldecode(), das du vergessen hast.

            Basti

            Kommentar


            • #7
              Super danke für deine Antwort. Ich habe das nun soweit geändert. Noch eine Frage habe ich allerdings.
              Du meinst, ich soll die ereg-Funktionen weglassen.
              Soll ich meine Zeilen:
              PHP-Code:
              if (eregi('Content-Type:'$name)) { $Fehler "Y"; }
              if (
              eregi('Content-Type:'$email)) { $Fehler "Y"; } 
              auch durch
              PHP-Code:
              if (strpos('Content-Type:'$name)) { $Fehler "Y"; }
              if (
              strpos('Content-Type:'$email)) { $Fehler "Y"; } 
              ersetzen?

              Kommentar


              • #8
                Die Zeilen kannst du weglassen. Wenn du Zeilenumbrüche verhindest, nützt einem Angreifer die Angabe 'Content-Type:' auch nichts.

                Prinzipiell aber ja.

                http://php.net/manual/en/ref.regex.php
                Tip: PHP also supports regular expressions using a Perl-compatible syntax using the PCRE functions. Those functions support non-greedy matching, assertions, conditional subpatterns, and a number of other features not supported by the POSIX-extended regular expression syntax.
                http://php.net/strpos
                Note: If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
                Um Übrigen solltest du deine Fehler-Sammelage mal übearbeiten. Anstatt "Y" und "N" wären true und false angebracht. Sinnig ist hier aber in aller Regel, ein leeres Array zu initialisieren und in dieses die Fehler reinzupacken, um sie dann im Formular wieder ausgeben zu können:

                PHP-Code:
                <?php

                $aErrors 
                = array();

                if (isset(
                $_POST['sent'])) {

                    
                $aErrors validateContactForm($_POST);

                    if (
                === count($aErrors)) {
                        
                processContactForm($_POST);
                        
                redirectToSuccessPage();
                        exit;
                    }
                }
                displayContactForm($_POST$aErrors);
                exit;

                function 
                validateContactForm($aData)
                {
                    
                $aErrors = array();

                    if (empty(
                $aData['name']))
                        
                $aErrors['name'][] = 'empty';

                    if (empty(
                $aData['email'])) {

                        
                $aErrors['email'][] = 'empty';

                    } else {

                        if (!
                isValidEMailAddr($aData['email'])
                            
                $aErrors['email'][] = 'invalid';
                    }

                    return 
                $aErrors;
                }

                // und so weiter halt...
                ?>
                Natürlich gehört das dann irgendwann mal in verschiedene Klassen... aber wichtiger ist das Prinzip, wie sowas sinnvoll aufgebaut werden kann. Ein möglichst einfacher Code-Teil ruft anhand des Request ($_POST-Date etc.) verscheidene Methoden auf, sammelt dabei wichtige Infos (hier die Fehler) und entscheidet was zu tun ist (welche "Seite" eingebunden wird, wohin weitergeleitet wird oder ...).

                Hier hast du also in in paar Zeilen (hier die ersten 16 Zeilen!) auf einen Blick klar, wie die Komponente tickt und kannst den Rest (Validierung einer Mail-Adresse, Formularausgabe etc.) auslagern und in der Anwendung mehrfach verwenden. Die Funktion zum Überprüfen de Mail-Adresse greift zB. nicht auf $_POST['email'] zu, sondern bekommt einen String übergeben. Das gleiche Spiel mit den anderen Funktionen.

                Nochwas:
                Du solltest das error_reporting-Level immer mindestens auf E_ALL setzen!

                Basti

                Kommentar


                • #9
                  Vielen Dank noch einmal für deine hilfreichen Antworten.
                  Ich gebe zu, deinen Code nicht gleich verstanden zu haben. Ich werde mir diesen aber in nächster Zeit anschauen und dann bei mir einbauen.
                  Da ich das aber diese Woche nicht schaffe und mein Formular trotzdem erst einmal geschützt sein soll, ist die von mir nun erstellete Variante ausreichend, wenn auch erst einmal nicht perfekt?

                  Kommentar


                  • #10
                    Zitat von Lia
                    wenn auch erst einmal nicht perfekt?
                    Was ist schon perfekt? Perfekt ist, wenns funktioniert. Mein Code oben war auch mehr als Anregung gedacht, in welche Richtung es weitergehen könnte.

                    Basti

                    Kommentar


                    • #11
                      Alles klar.
                      Ich werde mich damit auseinandersetzen.

                      THANX!!

                      Kommentar

                      Lädt...
                      X