HP-Bauer: Wie mache ich Formmail.pl vor Spammern sicher?

Hallo,

möchte gerne für ein Formular das Perlscript formmail.pl von Matt Wright verwenden. Nun habe ich über die Forumssuche erfahren, dass dieses Script unsicher sein soll. Was ist da dran? Es ist doch nicht gefährlicher, als wie wenn ich eine Mail-Adresse auf der HP angebe, oder? Kann ich die Sicherheit des Scriptes durch Konfiguration erhöhen? Was gibt es für einfache Alternativen?

Nächstes Problem:
Egal welches Script ich verwende, es sollte möglich sein, dass das Formular je nach Select-Box-Auswahl an unterschiedliche Empfänger versendet wird. Konkret handelt es sich um ein Kontakt- und Supportformular, welches Anfragen direkt an die jeweils zuständigen Mitarbeiter leiten soll. Wie realisiere ich dies einfach, schnell und sicher?

Bin für jeden Tipp dankbar.

MfG,
HP-Bauer

  1. Hallo.

    möchte gerne für ein Formular das Perlscript formmail.pl von Matt Wright verwenden.

    Baue besser auf dem hier angebotenen Formmailer auf:
    http://aktuell.de.selfhtml.org/tippstricks/cgiperl/form-mail/index.htm
    (Bitte beachte den Hinweis am Ende des Artikels)

    Egal welches Script ich verwende, es sollte möglich sein, dass das Formular je nach Select-Box-Auswahl an unterschiedliche Empfänger versendet wird. Konkret handelt es sich um ein Kontakt- und Supportformular, welches Anfragen direkt an die jeweils zuständigen Mitarbeiter leiten soll. Wie realisiere ich dies einfach, schnell und sicher?

    Zuerst musst du die Empfängeradressen direkt im Script definieren. Willst du an mehrere Empfänger senden, könnte das Ganze ein Array oder ein Hash sein:

    my @empf = ("kontakt","support");
    my $appx = "domain.tld";

    Innerhalb deines Formulares könntest du eine Dropdown-Liste definieren:

    <select name="empf" size="1">
      <option value="none">Bitte ausw&auml;hlen</option>
      <option value="alt1">Kontakt</option>
      <option value="alt2">Support</option>
    </select>

    Dieses fragst du ab:

    use CGI qw(param);

    if(param('empf') eq "alt1") {
      my $ziel = $empf[0].'@'.$appx;
    }
    elsif(param('empf') eq "alt2") {
      my $ziel = $empf[0].'@'.$appx;
    }
    else {
      # falscher Empfaenger
      # Fehlerausgabe
    }

    So in etwa :)

    Freundschaft!
    Siechfred

    --
    Wissen bedeutet zu wissen, wo es steht.
    1. Danke für den Tipp.

      Baue besser auf dem hier angebotenen Formmailer auf:
      http://aktuell.de.selfhtml.org/tippstricks/cgiperl/form-mail/index.htm
      (Bitte beachte den Hinweis am Ende des Artikels)

      Darf das Script auf einer kommerziellen Seite kostenlos verwendet werden? Soll ich besser das Script in Perl oder PHP nehmen? Servertechnisch geht beides und die HP basiert auf PHP?

      Wie erweitere ich das Script so, dass bestimmte Formularfelder überprüft werden und der Anwender evtl. die Möglichkeit hat, seine Eingabe zu korrigieren?

      MfG,
      HP-Bauer

      1. Servertechnisch geht beides und die HP basiert auf PHP?

        Tippfehler, kein "?" sondern ".".

        MfG,
        HP-Bauer

      2. Hallo.

        Darf das Script auf einer kommerziellen Seite kostenlos verwendet werden?

        Huch, da bin ich überfragt, würde allerdings spontan ja sagen. Ansonsten frage den Autor des Beitrages, seine E-Mail ist ja angegeben.

        Soll ich besser das Script in Perl oder PHP nehmen?

        Was dir persönlich besser liegt.

        Wie erweitere ich das Script so, dass bestimmte Formularfelder überprüft werden und der Anwender evtl. die Möglichkeit hat, seine Eingabe zu korrigieren?

        Oje, das sind je gleich zwei Fragen auf einmal, und wirklich helfen kann ich dir nur bei Perl, in PHP bin ich noch nicht so fit. Eine einfache Prüfung kannst du mit Hilfe von Regulären Ausdrücken realisieren:

        if(param('feld') =~ /^$muster$/) {
          my $feld = param('feld');
        }
        else {
          # Fehlerbehandlung
        }

        Das Problem mit der Korrektur von Eingaben kannst du über ein Affenformular in Verbindung mit Templates lösen. Du baust dir eine HTML-Seite, die dein Formular enthält, die relevanten Teile ersetzt du durch Templatevariablen:

        --- Codeschnipsel formular.tmpl ---
        <form action="script.pl" method="POST">
        <input type="text" name="email" value="<TMPL_VAR NAME="EMAIL">">
        <input type="text" name="name" value="<TMPL_VAR NAME="NAME">">
        --- Ende Codeschnipsel ---

        Die Ausgabe steuerst du wie folgt:

        sub TMPLOutput {
          use HTML::Template;
          my $template = HTML::Template->new(filename => 'formular.tmpl');
          $template->param( EMAIL => $_[0],
                            NAME  => $_[1]
                          );
          print "Content-Type: text/html\n\n", $template->output;
          exit 0;
        }

        Die sub Fehler rufst du in meinem Beispiel wie folgt auf:

        TMPLOutput("eingegebene E-Mail","eingegebener Name");

        Du kannst die Subroutine auch für das erstmalige Anzeigen des Formulars verwenden:

        TMPLOutput("Bitte eine E-Mail angeben","Bitte geben Sie Ihren Namen an");

        Die Doku zum Modul findest du hier:
        http://search.cpan.org/~samtregar/HTML-Template-2.7/Template.pm

        Freundschaft!
        Siechfred

        --
        Wissen bedeutet zu wissen, wo es steht.
      3. Woran kann das liegen das bei dem oben genannten Formmailer zwar keine Fehlermeldung kommt aber die Mails nie ankommen.

    2. Moin.

      Baue besser auf dem hier angebotenen Formmailer auf:
      http://aktuell.de.selfhtml.org/tippstricks/cgiperl/form-mail/index.htm
      (Bitte beachte den Hinweis am Ende des Artikels)

      Leider ist das Script auch nicht ganz sicher, da Eingaben vom User ungeparst im Header der Mail landen, siehe hierzu folgendes:
      http://forum.de.selfhtml.org/archiv/2004/6/82380/

      (ich hatte Stefan darauf schon aufmerksam gemacht...)

      Gruß Frank

      1. Hallo Frank.

        Leider ist das Script auch nicht ganz sicher, da Eingaben vom User ungeparst im Header der Mail landen [...] ich hatte Stefan darauf schon aufmerksam gemacht...

        Da hast du dein <I> ;)

        Freundschaft!
        Siechfred

        --
        Wissen bedeutet zu wissen, wo es steht.
        1. Wenn ich aber selbst einen PHP-Formmailer programmiere und die Felder im Code deklariere, dürfte es doch keine Probleme in Sachen Sicherheit geben?

          MfG,
          HP-Bauer

          1. Hallo.

            Wenn ich aber selbst einen PHP-Formmailer programmiere und die Felder im Code deklariere, dürfte es doch keine Probleme in Sachen Sicherheit geben?

            Das lässt sich so pauschal nicht beantworten, aber die Gefahr ist natürlich um ein Vielfaches geringer.
            MfG, at