Schutz vor Spamversand - geht,s auch einfacher?

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

  • #16
    Wie sieht das hier aus...

    PHP-Code:
    function cleanEmail($value)
    {
       
    $value preg_replace("/(Content-Transfer-Encoding:|MIME-Version:|content-type:|"
       
    ."Subject:|to:|cc:|bcc:|from:|reply-to:)/ims"""$value);

       
    $value preg_replace("/(%0A|\\\\r|%0D|\\\\n|%00|\\\\0|%09|\\\\t|%01|%02|%03|%04|%05|" 
       
    ."%06|%07|%08|%09|%0B|%0C|%0E|%0F|%10|%11|%12|%13)/ims"""$value); 

       return 
    $value;
    }

    // aufruf mit:
    mail(cleanEmail($mail), cleanEmail($betreff), cleanEmail($mailtext), cleanEmail($header)); 
    Ich weiss jetzt allerdings nicht so genau wofür %09 %10 %11 usw, steht...

    Grüsse
    Cosinus
    Wer mein jemand zu sein,
    hört auf jemand zu werden...!

    Kommentar


    • #17
      Zitat von cosinus Beitrag anzeigen
      Ich weiss jetzt allerdings nicht so genau wofür %09 %10 %11 usw, steht...
      Für URL-Escape-Sequenzen, aber ich verstehe nicht, was das bringen soll, da PHP die ja wieder auflöst (das Thema hatten wir schon). Der Code würde also doppelt URL-codierte Zeichen verbieten, macht das Sinn?
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #18
        Ich gebe zu, die letzte zeile habe ich gegoogelt...

        Was hältst Du hiervon?

        PHP-Code:
        function cleanEmail($value

           
        $value preg_replace("/(Content-Transfer-Encoding:|MIME-Version:|content-type:|" 
           
        ."Subject:|to:|cc:|bcc:|from:|reply-to:)/ims"""$value); 

           
        $value preg_replace("/(<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r).*/ims""",  $value);

           return 
        $value


        // aufruf mit: 
        mail(cleanEmail($mail), cleanEmail($betreff), cleanEmail($mailtext), cleanEmail($header)); 
        Ich will nur ganz sicher gehen

        Grüsse
        Cosinus
        Wer mein jemand zu sein,
        hört auf jemand zu werden...!

        Kommentar


        • #19
          Zitat von cosinus Beitrag anzeigen
          Ich will nur ganz sicher gehen
          Ja, das sieht ziemlich verzweifelt danach aus. Aber das wenigste davon ist logisch. Wie gesagt, wenn du alles nach einem Umbruch abschneidest, reicht das schon. Dadurch kann man keine bösen Header injizieren.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #20
            Zitat von AmicaNoctis Beitrag anzeigen
            Ja, das sieht ziemlich verzweifelt danach aus. Aber das wenigste davon ist logisch. Wie gesagt, wenn du alles nach einem Umbruch abschneidest, reicht das schon. Dadurch kann man keine bösen Header injizieren.
            Also dann komme ich auf Deinen Vorschlag zurück...

            PHP-Code:
            function cleanEmail($value)  
            {  
               
            $value preg_replace("/(Content-Transfer-Encoding:|MIME-Version:|content-type:|"  
               
            ."Subject:|to:|cc:|bcc:|from:|reply-to:)/ims"""$value);  

               
            $value preg_replace("<[\\r\\n].*$>s"""$value

               return 
            $value;  
            }  

            // aufruf mit:  
            mail(cleanEmail($mail), cleanEmail($betreff), cleanEmail($mailtext), cleanEmail($header)); 
            Soweit ok?


            Das Ganze sieht bei mir dann so aus, wobei die Variable $_adminmail fest vorgegeben ist, also nicht überprüft werden muss.

            PHP-Code:
            // Mailheader-Injection vermeiden --------------------------------------------
            function cleanEmail($value)  
            {  
               
            $value preg_replace("/(Content-Transfer-Encoding:|MIME-Version:|content-type:|"  
               
            ."Subject:|to:|cc:|bcc:|from:|reply-to:)/ims"""$value);  

               
            $value preg_replace("<[\\r\\n].*$>s"""$value

               return 
            $value;  
            }  

            // eMail versenden -----------------------------------------------------------
            function eMailSenden($_mail$_betreff$_mailtext$_adminmail)
            {
               if(
            strtoupper(substr(PHP_OS,0,3)=='WIN'))
               {
                  
            $umbruch "\r\n";
               }
               elseif(
            strtoupper(substr(PHP_OS,0,3)=='MAC'))
               {
                  
            $umbruch "\r";
               }
               else
               {
                  
            $umbruch "\n";
               }

               
            $header '';
               
            // $_header = "From: ".$_adminmail."<".$_adminmail.">".$umbruch;
               
            $_header.= "From: ".$_adminmail.$umbruch// wird benötigt
               
            $_header.= "Reply-To: ".$_adminmail.$umbruch// wird benötigt
               // $_header.= "Message-ID: ".md5(uniqid(time()))."@".getenv('SERVER_NAME').$umbruch;
               // $_header.= "MIME-Version: 1.0".$umbruch;
               // $_header.= "Content-type: text/plain; charset=ISO-8859-1".$umbruch;
               // $_header.= "Content-Transfer-Encoding: 7bit".$umbruch;
               // $_header.= "X-Priority: 3".$umbruch; // 1 = Hoch, 3 = normal
               // $_header.= "X-MSMail-Priority: Normal".$umbruch; // Normal, High
               
            $_header.= "X-Mailer: PHPlinX/ ".phpversion().$umbruch// wird bebötigt
               // $_header.= "X-MimeOLE: PHPlinX-Mailer".phpversion().$umbruch;

               
            return(mail(cleanEmail($_mail), cleanEmail($_betreff), cleanEmail($_mailtext), $_header));
            }

            // Aufruf mit:
            if(eMailSenden($_mail$_betreff$_mailtext$_adminmail) == true)
            {
                 
            // Meldung

            Grüsse
            Cosinus
            Wer mein jemand zu sein,
            hört auf jemand zu werden...!

            Kommentar


            • #21
              Den Mailtext würde ich nicht durch cleanEmail jagen

              Die Header-Feldnamen brauchst du eigentlich auch nicht extra abtesten, es reicht wirklich, wenn du die Umbrüche und alles was danach kommt wegwirfst:

              PHP-Code:
              function cleanEmail ($value) {  
                 return 
              preg_replace("<[\\r\\n].*$>s"""$value

              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #22
                Zitat von AmicaNoctis Beitrag anzeigen
                Den Mailtext würde ich nicht durch cleanEmail jagen

                Die Header-Feldnamen brauchst du eigentlich auch nicht extra abtesten, es reicht wirklich, wenn du die Umbrüche und alles was danach kommt wegwirfst:

                PHP-Code:
                function cleanEmail ($value) {  
                   return 
                preg_replace("<[\\r\\n].*$>s"""$value

                Hast Recht - würde nicht allzuviel vom Mailtext übrig bleiben

                Der enctype ist übrigens nur text/plain, da dürfte der Mailtext wohl harmlos sein.

                Aber verstehe ich das jetzt Richtig?

                Ich habe gegoogelt und Funktionen mit 20, 30 Zeilen Text gefunden wo alles mögliche Gefiltert und ersetzt wird,
                habe dutzende Forumbeiträge gelesen, nach Tutorials gesucht ...
                ... und die eine Zeile da oben soll die ultimative Lösung sein ?

                Also so?

                PHP-Code:
                // Mailheader-Injection vermeiden -------------------------------------------- 
                function cleanEmail($value)   
                {   
                   
                $value preg_replace("<[\\r\\n].*$>s"""$value)  

                   return 
                $value;   
                }   

                // eMail versenden ----------------------------------------------------------- 
                function eMailSenden($_mail$_betreff$_mailtext$_adminmail

                   if(
                strtoupper(substr(PHP_OS,0,3)=='WIN')) 
                   { 
                      
                $umbruch "\r\n"
                   } 
                   elseif(
                strtoupper(substr(PHP_OS,0,3)=='MAC')) 
                   { 
                      
                $umbruch "\r"
                   } 
                   else 
                   { 
                      
                $umbruch "\n"
                   } 

                   
                $header ''
                   
                // $_header = "From: ".$_adminmail."<".$_adminmail.">".$umbruch; 
                   
                $_header.= "From: ".$_adminmail.$umbruch// wird benötigt 
                   
                $_header.= "Reply-To: ".$_adminmail.$umbruch// wird benötigt 
                   // $_header.= "Message-ID: ".md5(uniqid(time()))."@".getenv('SERVER_NAME').$umbruch; 
                   // $_header.= "MIME-Version: 1.0".$umbruch; 
                   // $_header.= "Content-type: text/plain; charset=ISO-8859-1".$umbruch; 
                   // $_header.= "Content-Transfer-Encoding: 7bit".$umbruch; 
                   // $_header.= "X-Priority: 3".$umbruch; // 1 = Hoch, 3 = normal 
                   // $_header.= "X-MSMail-Priority: Normal".$umbruch; // Normal, High 
                   
                $_header.= "X-Mailer: PHPlinX/ ".phpversion().$umbruch// wird bebötigt 
                   // $_header.= "X-MimeOLE: PHPlinX-Mailer".phpversion().$umbruch; 

                   
                return(mail(cleanEmail($_mail), cleanEmail($_betreff), $_mailtext$_header)); 


                // Aufruf mit: 
                if(eMailSenden($_mail$_betreff$_mailtext$_adminmail) == true

                     
                // Meldung 

                Ist das soweit richtig?
                Da hätte ich mir ne Menge arbeit sparen können ;-)

                Grüsse
                Cosinus
                Zuletzt geändert von cosinus; 04.05.2010, 16:20.
                Wer mein jemand zu sein,
                hört auf jemand zu werden...!

                Kommentar


                • #23
                  Kannst du mal die URLs dieser Anleitungen posten, dann sehe ich mir an, ob ich vielleicht was übersehen hab? Aber eigentlich bin ich mir sicher, dass das Abschneiden reicht, bzw. Anfragen mit solchen Umbrüchen komplett zurückzuweisen.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #24
                    Mach es dir doch nicht so schwer, es ist ganz einfach. Du hast ein Formular mit Textfeldern für Absenderadresse und Betreff. Weil du diese Daten in Emailheader verwenden willst, musst du Injections erkennen. Jede Injection beginnt mit einem \n. Also wenn du ein Newline findest, ist sofort Feierabend. Es werden keine weiteren Daten verarbeitet und erst recht keine Mail geschickt. Die IP kommt meinetwegen noch in eine Sperrliste, sonst nichts. Keine Fehlermeldung, kein Versuch, die Injection rauszufiiltern, nichts. Nur exit().

                    Denn in einfache Textinputs kann man kein Newline direkt eingeben. Also wenn du eins findest, hat sich jemand an deinem Formular zu schaffen gemacht und sowas geschieht immer in böser Absicht.

                    Kommentar


                    • #25
                      Absolut Plausibel onemorenerd..
                      Ich muss gestehen, das ich das aus der Sicht selber auch nie gesehen habe, aber das stimmt natürlich..
                      Nur lesen bildet also doch :P

                      Kommentar


                      • #26
                        Zitat von AmicaNoctis Beitrag anzeigen
                        Kannst du mal die URLs dieser Anleitungen posten, dann sehe ich mir an, ob ich vielleicht was übersehen hab? Aber eigentlich bin ich mir sicher, dass das Abschneiden reicht, bzw. Anfragen mit solchen Umbrüchen komplett zurückzuweisen.
                        hier ist ein Beispiel: Mail Header Injection: Irgendwann lernen es alle [Sicherheitsupdate] | PHP Application and Website Defense

                        Grüsse
                        Cosinus
                        Wer mein jemand zu sein,
                        hört auf jemand zu werden...!

                        Kommentar


                        • #27
                          Zitat von onemorenerd Beitrag anzeigen
                          Mach es dir doch nicht so schwer, es ist ganz einfach. Du hast ein Formular mit Textfeldern für Absenderadresse und Betreff. Weil du diese Daten in Emailheader verwenden willst, musst du Injections erkennen. Jede Injection beginnt mit einem \n. Also wenn du ein Newline findest, ist sofort Feierabend. Es werden keine weiteren Daten verarbeitet und erst recht keine Mail geschickt. Die IP kommt meinetwegen noch in eine Sperrliste, sonst nichts. Keine Fehlermeldung, kein Versuch, die Injection rauszufiiltern, nichts. Nur exit().

                          Denn in einfache Textinputs kann man kein Newline direkt eingeben. Also wenn du eins findest, hat sich jemand an deinem Formular zu schaffen gemacht und sowas geschieht immer in böser Absicht.
                          Hallo,

                          zeig doch mal einen kurzen Beispielcode...

                          Grüsse
                          Cosinus
                          Wer mein jemand zu sein,
                          hört auf jemand zu werden...!

                          Kommentar


                          • #28
                            Zitat von cosinus Beitrag anzeigen
                            hier ist ein Beispiel
                            Der Herr Kachel bringt zwar viel Beispielcode dort unter, aber er versäumt es, dabei zu erklären, was das alles bringen soll. Ich sehe keinen plausiblen Mehrwert darin, Header-Namen auch zu ersetzen (wenn man sich doch sowieso schon um die Umbrüche gekümmert hat) und mir bleibt nach wie vor unklar, welche Gefahr URL-Escape-Sequenzen im Kontext eine E-Mail haben sollen.

                            Dass man den Message Body prüfen sollte, dagegen sag ich ja nichts. Wenn es aber Plaintext-Mails sind, kann man sich das sparen.


                            Zitat von cosinus Beitrag anzeigen
                            zeig doch mal einen kurzen Beispielcode...
                            Beispiel wofür?
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #29
                              Zitat von onemorenerd Beitrag anzeigen
                              Mach es dir doch nicht so schwer, es ist ganz einfach. Du hast ein Formular mit Textfeldern für Absenderadresse und Betreff. Weil du diese Daten in Emailheader verwenden willst, musst du Injections erkennen. Jede Injection beginnt mit einem \n. Also wenn du ein Newline findest, ist sofort Feierabend. Es werden keine weiteren Daten verarbeitet und erst recht keine Mail geschickt. Die IP kommt meinetwegen noch in eine Sperrliste, sonst nichts. Keine Fehlermeldung, kein Versuch, die Injection rauszufiiltern, nichts. Nur exit().

                              Denn in einfache Textinputs kann man kein Newline direkt eingeben. Also wenn du eins findest, hat sich jemand an deinem Formular zu schaffen gemacht und sowas geschieht immer in böser Absicht.

                              Hast Recht,

                              wenn mir jemand bösen Code unterjubeln will, warum soll ich mir die
                              Mühe machen, schadhaften Code auszufiltern und alles Mögliche zu testen.
                              Schliesslich will ich die eMail ja eh nicht abschicken....

                              Also sollte sowas in dieser Art reichen oder?

                              PHP-Code:
                              $value urldecode($value);
                              if(
                              preg_match("/^[\r|\n]*$/i"$value))
                              {
                                 
                              // spam --> Abbruch

                              Da ich mich allerdings mit regulären Ausdrücken nicht gut auskenne dürfe das
                              Beispiel wohl nicht so ganz richtig sein...

                              Grüsse
                              Cosinus
                              Wer mein jemand zu sein,
                              hört auf jemand zu werden...!

                              Kommentar


                              • #30
                                Na wenn du dich mit regulären Ausdrücken nicht so richtig auskennst, dann geht es auch so:
                                PHP-Code:
                                $input $_POST['email'] . $_POST['subject'];
                                if (
                                strpos($input"\n") !== false || strpos($input"\r") !== false
                                || stripos($input'%0a') !== false || stripos($input'%0d') !== false) {
                                    exit();

                                Kommentar

                                Lädt...
                                X