Schutz vor Spamversand - geht,s auch einfacher?

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

  • AmicaNoctis
    antwortet
    Zitat von onemorenerd Beitrag anzeigen
    Aber Mailserver rangieren gleich hinter Browsern was die eigenmächtige "Korrektur der Eingabe" angeht.
    Die Expansion von \n zu \r\n hat es sogar ins PHP-Manual geschafft.
    Das hat ja nichts mit dem Mailserver zu tun, sondern mit der Implementation von sendmail und der Tatsache, dass UNIX nun mal nur LF als Zeilenumbruch benutzt.

    Zitat von onemorenerd Beitrag anzeigen
    Die Interpretation von Hexcodes ist mir bisher noch nicht untergekommen, aber Vorsicht ist besser als Nachricht.
    Ich seh da trotzdem keinen Sinn drin. Hexcodes für Zeilenumbrüche könnte man genausogut als 0x0a, \0a, #0a, $0a angeben und die könnten theoretisch blödsinnigerweise von einem Mailserver interpretiert werden, aber die Chance ist genauso niedrig wie bei %0a. Warum aber wird das als böses Zeichen besonders behandelt? Das ergibt keinen Sinn.

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    Eigentlich bräuchte man nur \r\n suchen. Aber Mailserver rangieren gleich hinter Browsern was die eigenmächtige "Korrektur der Eingabe" angeht.
    Die Expansion von \n zu \r\n hat es sogar ins PHP-Manual geschafft.
    Die Interpretation von Hexcodes ist mir bisher noch nicht untergekommen, aber Vorsicht ist besser als Nachricht.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    Zitat von cosinus Beitrag anzeigen
    ... damit aus '%0a' '\n' wird?
    Aber wo, wie, warum und wann sollte das denn passieren? PHP macht das schon selber und es komm bereits als \n an, man müsste %25%0a posten, damit PHP es zu %0a decodiert, aber was hätte das für ein Gefahrenpotenzial in einem E-Mail-Header?

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    Zitat von onemorenerd Beitrag anzeigen
    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();


    Oh - danke...

    Für PHP4 nehme ich dann nur strpos() - wird bestens funktionieren denke ich

    Grüsse
    Cosinus

    *join*

    Zitat von AmicaNoctis Beitrag anzeigen
    @cosinus: Warum das urldecode?
    @onemornerd: Wieso nach %0d und %0a testen? Entweder begreife ich es nicht, wie URL-Escape-Sequenzen schädlich sein können oder es ist einfach überflüssig, die abzutesten.
    ... damit aus '%0a' '\n' wird?

    Grüsse
    Cosinus
    Zuletzt geändert von AmicaNoctis; 04.05.2010, 23:50. Grund: Doppelposting

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    @cosinus: Warum das urldecode?
    @onemornerd: Wieso nach %0d und %0a testen? Entweder begreife ich es nicht, wie URL-Escape-Sequenzen schädlich sein können oder es ist einfach überflüssig, die abzutesten.

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    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();

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    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

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    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?

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    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

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    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

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    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.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    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.

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    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.

    Einen Kommentar schreiben:


  • AmicaNoctis
    antwortet
    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

    Einen Kommentar schreiben:


  • cosinus
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X