Wonnie: Formmailer von Selfhtml oder Sourceforge

Hallo,
mal eine Frage für die Halbzeitpause oder später.
Wer kennt die beiden formmailer ?
Ich will einen Formmailer einrichten, wobei ich keine Programmierkenntnisse habe.
Ich habe jetzt den Formmailer von Selfhtml
(http://aktuell.de.selfhtml.org/tippstricks/cgiperl/form-mail/)
und den NMS formmail
(http://nms-cgi.sourceforge.net/formmail_compat-3.14c1/FormMail.pl)
in der Auswahl.
Beide könnte ich anhand der Beschreibung an meine Bedürfnisse anpassen.
Was mich aber wundert ist, dass der nms formmail über 3000 Quellzeilen hat und der von Selfhtml nur ein paar Dutzend Zeilen.
Natürlich kann ich den Inhalt nicht lesen (lesen schon, aber nicht verstehen).
Daher die Fragen.
Hat der nms-mailer eine Menge überflüssiges Zeug oder dient der viele Code der Sicherheit oder ........?
Schönen Abend
Wonnie

  1. Hat der nms-mailer eine Menge überflüssiges Zeug oder dient der viele Code der Sicherheit oder ........?

    Sicherlich geht es in erster Linie um die Sicherheit. Der SELFHTML-Mailer ist ja in dieser Rohform nicht wirklich zu verwenden, weil man ihn viel zu einfach mißbrauchen kann.
    Aber 3000 Zeilen? Keine Ahnung was die da alles drin stehen. Mein Mail-Modul hat inklusive Kommentare ca. 250 Zeilen, und da sind neben Sicherheits-Abfragen auch Möglichkeiten zu Multipart-Emails oder Datei-Anhängen drin.
    Klingt ja interessant, ich werd mir das bei Gelegenheit vielleicht mal anschauen.

    Aber ich rate dir auf jeden Fall ab, das SELFHTML-Programm zu verwenden, falls du nicht die Kenntnisse hast, um zumindest ein paar rudimentäre Sicherheits-Abfragen einzubauen.

    --
    selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
    << Life is just a moment in eternity, yet every life echoes there >>
    1. hallo,

      Aber 3000 Zeilen? Keine Ahnung was die da alles drin stehen.

      Dann schau es dir doch einfach an. Es gibt da jede Menge gut gemeinter, aber in nahezu allen Fällen völlig überflüssiger inline-Module. Es ist ein riesiger Baukasten. Bei dem Tipps/Tricks-Beispiel muß man das dazutun, was man wirklich braucht. Bei dem NSM-Beispiel muß man das streichen, was überdimensioniert ist. Das Problem besteht darin, herauszufinden, was man nun wirklich braucht.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
    2. Moin.

      Der SELFHTML-Mailer ist ja in dieser Rohform nicht wirklich zu verwenden, weil man ihn viel zu einfach mißbrauchen kann.

      Bitte? Dann geh doch mal die Zeilen durch, es sind ja nach Abzug der Leer- und Kommentarzeilen nur 28, und zeige uns die unsichere Stelle.

      Als Spamrelay läßt es sich jedenfalls nicht nutzen. Jeder Mißbrauchsversuch endet in einer Mail an die Adresse, die im Script fest codiert ist. Daß man dieses Spamaufkommen mittels geeignetem Code reduzieren kann, ist klar. Und dazu gibt es hier im Achiv genügend Hinweise (leere hidden fields, die im Script auch leer ankommen müssen, überprüfen der Inhalte der Felder auf typische Mailheader wie to, from, bcc, content-type, mime-version, content-transfer-encoding, subject, bei Spam einen HTTP-Status 404 zurückgeben.)

      Aber Mißbrauch - nicht mit diesem Script.

      Gruß Frank

      1. Ebenfalls Moin,
        danke für den sachlichen Beitrag.
        Mich würde als Anfänger auch interessieren, was konkret unsicher ist und wie man dem entsprechend abhelfen kann.
        Vielleicht hat auch schon jemand die vielen Hinweise im Archiv berücksichtigt und kompakt zusammengetragen oder sogar schon in seinem Script realisiert ?

        Gruß Wonnie

        1. Moin.

          Mich würde als Anfänger auch interessieren, was konkret unsicher ist und wie man dem entsprechend abhelfen kann.

          Hab im Moment wenig Zeit. Deshalb nur eine kurze Antwort.
          Verwende NIE Formulareingaben, ohne sie vorher geprüft und/oder bearbeitet zu haben. Sie dürfen NIE unbearbeitet im Mailheader landen. Siehe Archiv. Bis vor einiger Zeit war diese Fehler auch im SEHLHTML-Formmailer enthalten, jetzt ist er aber gefixt ($subject =~ s/\s/ /g;).

          Gruß Frank

          1. Hallo Frank,

            Hab im Moment wenig Zeit. Deshalb nur eine kurze Antwort.

            Danke !
            Gruß Wonnie

      2. Bitte? Dann geh doch mal die Zeilen durch, es sind ja nach Abzug der Leer- und Kommentarzeilen nur 28, und zeige uns die unsichere Stelle.

        Hmm, Ok, irgendwie hatte ich das Script anders im Kopf (is ne Weile her), z.B. war mir nicht bewusst, dass die Zeile

          
        # -------> alle Whitespace-Zeichen (Leerzeichen, Tabulator, Newline) in Leerzeichen wandeln  
        #             VERHINDERT sonst möglichen MISSBRAUCH des Skripts  
        $subject =~ s/\s/ /g;  
        
        

        existiert.

        Somit nehme ich (fast) alles zurück. Die einzige für mich bleibende Kritik ist, dass nicht abgefragt wird, von welcher Seite aus die Daten übergeben wurden. Aber das kann - wie bereits erwähnt - im schlimmsten Fall ja nur zur Folge haben, dass man selbst eine Menge Spam bekommt.

        --
        selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
        << Life is just a moment in eternity, yet every life echoes there >>
        1. Die einzige für mich bleibende Kritik ist, dass nicht abgefragt wird, von welcher Seite aus die Daten übergeben wurden.

          Wie kann man das prüfen ?

          Dann habe ich noch weitere Fragen/Anmerkungen:

          Was mir aufgefallen ist: Es wurde mir strengstens empfohlen, mit
          "use strict" zu arbeiten. Wenn ich das einfüge, erhalte ich Fehler in dem Formmailer von Selfhtml.

          Welche Werte muss ich in den folgenden Statements angeben, wenn ich das Script local testen will (Apache-Server und Mercury-Mail)?

          $Sendmail_Prog = "/usr/lib/sendmail";
          $mailto = "mailadresse@example.org";

        2. Moin.

          Somit nehme ich (fast) alles zurück. Die einzige für mich bleibende Kritik ist, dass nicht abgefragt wird, von welcher Seite aus die Daten übergeben wurden.

          Das geht nur per REFFERER, und der ist leicht zu fälschen - was für Spammer mit einem entsprechenden Script kein Problem ist.

          Aber das kann - wie bereits erwähnt - im schlimmsten Fall ja nur zur Folge haben, dass man selbst eine Menge Spam bekommt.

          Wenn man die Tipps bzgl. hidden fields und Filtern bestimmter Inhalte implementiert, kann das Spamaufkommen gegen null gehen - bis die Spammer sich auch dagegen was einfallen lassen.

          Ein paar kleine Erweiterungen des Formmailers, und schon reduziert sich das Spamaufkommen. Mit der Spamerkennung über Schlüsselwörter schließt man u.U. die User aus, die genau diese Wörter so verwenden. Die regulären Ausdrücke lassen sich aber noch verfeinern, so daß das sehr selten wird. Das wollen wir hier aber nicht posten - schließlich sollen es die Spammer nicht soooo leicht haben ;-)

          -------> interne Daten aus den erwarteten hidden-Feldern auslesen:

          $spamField = $query->param('mailto');  # -------> Name des Feldes zum "Anfüttern" wählen, z.B. mailto

          -------> Prüfen ob hidden field zur Spamerkennung leer ist:

          if ($spamField ne "") {
             &error;
          }

          -------> Schlüsselwörter für Spamerkennung (regExp):

          $spamKey = 'content-type|mime-version|content-transfer-encoding|subject:|to:|from:|cc:|bcc:';

          foreach(@names) {
            $name = $_;
            @values = "";
            @values = $query->param($name);
            if($name ne "return" && $name ne "subject" && $name ne "delimiter" && $name ne "mailto") {
              foreach $value (@values) {
                # -------> Spamerkennung an Hand der Keywords
                if (lc($value) =~ /$spamKey/ ) {
                   &error;
                }
                $mailtext = $mailtext.$name;
                $mailtext = $mailtext.$delimiter;
                $mailtext = $mailtext.$value."\n";
              }
            }
          }

          sub error {
            print $query->header('text/html','404 Not Found');
            print $query->start_html(-title=>'404 Not Found');
            print "<h1>404 Not Found</h1>";
            print $query->end_html;
            exit;
          }
          Gruß Frank

          1. Moin.

            -------> interne Daten aus den erwarteten hidden-Feldern auslesen:

            $spamField = $query->param('mailto');  # -------> Name des Feldes zum "Anfüttern" wählen, z.B. mailto

            -------> Prüfen ob hidden field zur Spamerkennung leer ist:

            if ($spamField ne "") {
               &error;
            }

            Hmm, bei genauem Nachdenken stellt sich raus, daß das zuviel Code ist: leere Felder werden gar nicht übertragen. Deshalb sollte auch diese Zeile reichen:

            -------> Prüfen ob hidden field zur Spamerkennung leer ist:

            &error unless $query->param('mailto');

            Gruß Frank

            1. Hallo,

              Hmm, bei genauem Nachdenken stellt sich raus, daß das zuviel Code ist: leere Felder werden gar nicht übertragen.

              Das Feld wird auch übertragen, wenn es leer ist. Ich habe die Abfrage so eingebaut, wie Du ursprünglich geschrieben hast - und es funktioniert.

              Womit ich aber noch Probleme habe, ist der mailversand, wenn ich es lokal auf meinem Apache-Server und Mercury-Mail testen will.

              Weiß jemand, was in diesem Fall unten in $Sendmail_Prog und $mailto angegeben werden muss ?

              open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
              print MAIL "To: $mailto\n";

              1. Moin.

                Weiß jemand, was in diesem Fall unten in $Sendmail_Prog und $mailto angegeben werden muss ?

                nö, Mercury-Mail kenne ich nicht. Hilft google nicht weiter?

                open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

                Das | (pipe) scheint mir aber dort falsch am Platz.

                Gruß Frank

                1. nö, Mercury-Mail kenne ich nicht. Hilft google nicht weiter?

                  Mercury war Bestandteil des Freeware-Apche-Servers. In Google leider nichts gefunden.

                  open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
                  Das | (pipe) scheint mir aber dort falsch am Platz.

                  Das Statement ist original aus dem Selfhtml-Formmailer.
                  Gruß
                  Wonnie

                  1. Moin.

                    open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
                    Das | (pipe) scheint mir aber dort falsch am Platz.

                    Das Statement ist original aus dem Selfhtml-Formmailer.

                    Stimmt. Richtig.

                    Die Frage ist ja: hat Mercury Mail ein sendmail-kompatibles Interface, kann es also von STDIN (Standardeingabe) die Daten entgegen nehmen. Kann es das nicht, kannst Du es auch nicht mit open(MAIL,"|$Sendmail_Prog -t") benutzen.

                    Als Alternative kannst Du mal fake sendmail(freeware) probieren, oder sendmail for windows(30-Tage frei).

                    Eine 3. Variante gibt es - wenn es nur um den lokalen Test des Scripts geht. Ersetze die Zeile

                    open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";

                    durch die Zeilen

                    $debug = "debug.txt";
                    open (MAIL,">>$debug") || die "Can't open $debug $!\n";

                    Dann werden alle Infos, die eigentlich per Mail gesendet werden sollen, in die Datei debug.txt geschrieben.

                    Gruß Frank

                    P.S. und vor dem hochladen auf den Server die Änderung zurücknehmen ;-)

                    1. $debug = "debug.txt";
                      open (MAIL,">>$debug") || die "Can't open $debug $!\n";

                      Danke, das genügt mir für den Test !

            2. Moin.

              -------> Prüfen ob hidden field zur Spamerkennung leer ist:

              &error unless $query->param('mailto');

              Oh, oh - vor dem schreiben denken.. auch falsch, schließlich soll &error aufgerufen werden, wenn $query->param('mailto') leer ist und nicht umgekehrt,  Version 1 ist also schon ok...

              Gruß Frank

  2. hallo,

    mal eine Frage für die Halbzeitpause oder später.

    Kannst du bitte erläutern, was eine Halbzeitpause ist? Bedeutet das, daß ich, wenn mir 15 Minuten Pause zustehen, nur 7,5 Minuten nehmen darf? Mir ist kein Betrieb bekannt, dessen Pausenzeitregelungen einen derart irritierenden Begriff enthalten ...

    Wer kennt die beiden formmailer ?

    Ich natürlich.

    Ich will einen Formmailer einrichten, wobei ich keine Programmierkenntnisse habe.

    Dann laß es lieber.

    Ich habe jetzt den Formmailer von Selfhtml
    http://aktuell.de.selfhtml.org/tippstricks/cgiperl/form-mail

    Ein sehr altes Stück, das allenfalls als Beispiel gedacht ist und jede Menge "Lücken" enthält. Es stellt gewissermaßen einen Embryo dar, den man hätscheln und bei seinem Wachstum begleiten muß.

    und den NMS formmail
    http://nms-cgi.sourceforge.net/formmail_compat-3.14c1/FormMail.pl

    Ohje.

    Beide könnte ich anhand der Beschreibung an meine Bedürfnisse anpassen.

    Dessen wäre ich nicht so sicher.

    Was mich aber wundert ist, dass der nms formmail über 3000 Quellzeilen hat und der von Selfhtml nur ein paar Dutzend Zeilen.

    Für einen "formmailer" brauchst du kaum mehr als allerhöchstens zwei Dutzend Zeilen. Du kannst es aber auch extrem ausbauen und diverse inline-Module neu erfinden, und genau das haben die Erben von Matt Wright getan.

    Natürlich kann ich den Inhalt nicht lesen (lesen schon, aber nicht verstehen).

    Dann solltest du dich bemühen, Perl zu lernen. SELFHTML bietet einen ganz passablen Einstieg, hat aber Grenzen.

    Eins solltest du _bitte_ beherzigen: setze _niemals_ ein Script ein, das du nicht vollständig verstehst. Studiere die Scripts, die dir angeboten werden (gerade für diverse "Formmailer" gibt es wohl ein paar tausend frie Scripts im Internet). Aber nutze sie erst dann, wenn du wirklich _jeden_ Buchstaben und _jeden_ Leerraum und _jedes_ einzelne Zeichen verstanden hast.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Eins solltest du _bitte_ beherzigen: setze _niemals_ ein Script ein, das du nicht vollständig verstehst. Studiere die Scripts, die dir angeboten werden (gerade für diverse "Formmailer" gibt es wohl ein paar tausend frie Scripts im Internet). Aber nutze sie erst dann, wenn du wirklich _jeden_ Buchstaben und _jeden_ Leerraum und _jedes_ einzelne Zeichen verstanden hast.

      Na na, ganz so drastisch würde ich's jetzt mal nicht formulieren. Zumindest bei Scripts aus sicheren Quellen (z.b cpan.org) kann man sich wohl drauf verlassen, dass sie auch das tun was sie sollen und nichts anderes.
      Oder kennst du etwa die Funktionen aller Standard-Module, die du in deine Programme einbindest? ;p

      --
      selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
      << Life is just a moment in eternity, yet every life echoes there >>
      1. hallo,

        Oder kennst du etwa die Funktionen aller Standard-Module, die du in deine Programme einbindest?

        Selbstverständlich. Ein Modul, das ich nicht kenne, würde ich auch nicht einbinden.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
        1. Selbstverständlich. Ein Modul, das ich nicht kenne, würde ich auch nicht einbinden.

          Aber Du verwendest doch garantiert Dutzende von Systemmodulen/DLLS, die Du nicht kennst, oder?
          Und Du verwendest einen Browser, der garantiert auch Lücken hat, selbst wenn es nicht der IE ist.

          Schön wäre es, wenn wir auf das Thema zurückkommen könnten.
          Vielleicht könnte eine(r) der Spezialisten auf dem Gebiet seinen wasserdichten Formmailer der Selfhtml-Gemeinde zur Verfügung stellen ?
          Gruß
          Wonnie

          1. hallo,

            Selbstverständlich. Ein Modul, das ich nicht kenne, würde ich auch nicht einbinden.
            Aber Du verwendest doch garantiert Dutzende von Systemmodulen/DLLS, die Du nicht kennst, oder?

            Um es kurz zu machen: nein, verwende ich nicht. Jedenfalls nicht für irgendeinen Formmailer.

            Und Du verwendest einen Browser, der garantiert auch Lücken hat, selbst wenn es nicht der IE ist.

            Das ist hier völlig irrelevant.

            Grüße aus Berlin

            Christoph S.

            --
            Visitenkarte
            ss:| zu:) ls:& fo:) va:) sh:| rl:|
            1. Um es kurz zu machen: nein, verwende ich nicht. Jedenfalls nicht für irgendeinen Formmailer.

              Also aber für andere Zwecke. Was macht es für einen Unterschied, an welcher Stelle Du auf Unbekanntes vertraust. A

              Und Du verwendest einen Browser, der garantiert auch Lücken hat, selbst wenn es nicht der IE ist.

              Das ist hier völlig irrelevant.

              Warum ? Es gilt obengeagtes.

        2. Oder kennst du etwa die Funktionen aller Standard-Module, die du in deine Programme einbindest?

          Selbstverständlich. Ein Modul, das ich nicht kenne, würde ich auch nicht einbinden.

          Das ist doch übertrieben.

          Es ist gängige Programmierpraxis das Rad nicht jedesmal neu zu erfrinden und vorhandene und i.d.R. (je nach Quelle) tausendfach geprüfte Module und Erweiterungen zu benutzen. Gerade für Perl ist das üblich.

          Struppi.

          --
          Javascript ist toll (Perl auch!)
    2. Hallo Freunde des gehobenen Forumsgenusses,

      Eins solltest du _bitte_ beherzigen: setze _niemals_ ein Script ein, das du nicht vollständig verstehst. Studiere die Scripts, die dir angeboten werden (gerade für diverse "Formmailer" gibt es wohl ein paar tausend frie Scripts im Internet). Aber nutze sie erst dann, wenn du wirklich _jeden_ Buchstaben und _jeden_ Leerraum und _jedes_ einzelne Zeichen verstanden hast.

      Willst du damit ausdrücken, dass du die Quellen des Apache, PHP, Perl, Linux vorwärts und rückwärts runterbeten kannst?

      Gruß
      AlexanderSCNRBrock

      1. hallo Alexander,

        Willst du damit ausdrücken, dass du die Quellen des Apache, PHP, Perl, Linux vorwärts und rückwärts runterbeten kannst?

        Darum ging es gar nicht. Es war im Gegenteil ein Perl-Script im Vergleich zu einem anderen gefragt. "Apache, PHP, Linux" war gar nicht angesprochen. Im übrigen hat der Apache mit Scripts so gut wie nichts zu tun (wow, jetzt dürft ihr fragen, wie ich diese kühne Behauptung aufstellen kann). Auf einer Linux-Maschine laufen selbstverständlich eine Menge Scripts bereits beim Systemstart, aber die gehören halt zum System, man braucht die nicht zu verstehen - und wenn man sie nicht versteht, sollte man sich hüten, sie umzubauen.

        Die Frage im OP ging nach einer _speziellen_ Anforderung, einem Formmailer. Den kann man mit Perl, PHP, C und noch einigen andern Sprachen bauen. Aber dann ist es immer ein "selbst erstelltes" Script, und wenn man es sich nur irgendwo "besorgt" hat, ohne es zu verstehen, wird es seine Aufgabe zwar möglicherweise sogar erfüllen, aber noch allerhand "Optionen" wie zum Beispiel Sicherheitslöcher offenlassen. Daher plädiere ich nachdrücklich dafür, Scripts als Bestandteil eines Webangebots eben tatsächlich erst dann einzusetzen, wenn man weiß (oder zu wissen meint), was diese Scripts denn tatsächlich tun.

        Grüße aus Berlin

        Chris"unverstanden"toph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
    3. Aber nutze sie erst dann, wenn du wirklich _jeden_ Buchstaben und _jeden_ Leerraum und _jedes_ einzelne Zeichen verstanden hast.

      Damit schließt Du ja 95% der Internet-User aus, sich über Formulare
      kontaktieren zu lassen - oder Du zwingst sie, entsprechende kostenpflichtige Hilfe in Anspruch zu nehmen?
      Im übrigen nutze ich Word, Excel etc., ohne auch nur einmal das Coding angesehen zu haben !

      1. Hallo Wonnie.

        Im übrigen nutze ich Word, Excel etc., ohne auch nur einmal das Coding angesehen zu haben !

        Ich nicht und selbst wenn ich es täte, hätte ich nicht einmal die Möglichkeit hierzu. Das ist das Problem.

        Einen schönen Dienstag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
    4. Hallo.

      Mir ist kein Betrieb bekannt, dessen Pausenzeitregelungen einen derart irritierenden Begriff enthalten ...

      Weder erschließt sich mir der Zusammenhang zwischen Pausen und Betrieben, noch sollte man mit der vorgeblichen Unkenntnis von Verbänden mit deutschlandweit über sechs Millionen Mitgliedern hausieren gehen.
      MfG, at

  3. Hallo Wonnie,

    während sich die anderen noch über Codeprobleme unterhalten (und diese Diskussion ist notwendig, dochdoch), hier ein unfachmännischer Hinweis:

    Christoph hat recht - Du kannst Formmailer in jedem beliebigen Umfang aus dem Netz ziehen. Einen einfachen, den ich empfehlen würde gibt es bei www.planetc.dingsbums - look for "planetmail". Der ist floodinggeschützt (damit niemand deine maschine als spamschleuder missbraucht) und leidlich dokumentiert. Hat nicht allzuviele features, ist aber dafür sehr handlich und der quellcode ist für das wesentliche in deutsch kommentiert.

    Ich habe auch null Ahnung von Perl oder PHP oder whatsoever, aber ich arbeite mich rein. Mach dasselbe und alles wird gut.

    Grüße, viel Erfolg,
    Claus

    1. Danke für den Hinweis!