shadow: Formmailer Sicher oder Nicht

Hi ihr fleißigen Forumsbesucher, könnt ihr mir sagen, ob dieser von de.selfhtml.org kopierte Perl Formmailer sichher ist?

Skript:

#!/usr/bin/perl

-------> SMTP-Programm zum Versenden der Mail:

my $Sendmail_Prog = "/usr/sbin/sendmail";

-------> Modul für CGI-Scripts einbinden:

use CGI;
use strict;

-------> Modul für CGI-Scripts zum Einlesen der Formulardaten anwenden:

my $query = new CGI;
my @names = $query->param;

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

my $delimiter = ':'
my $mailto = 'Email-Addy';
my $returnhtml = $query->param('return');
my $subject = 'Irgendwas';

-------> Text der E-Mail aus den Formulardaten ermitteln:

my $mailtext = "";
my $name;
my @values;
my $value;

foreach(@names) {
  $name = $_;
  @values = "";
  @values = $query->param($name);
  if($name ne "mailto" && $name ne "return" && $name ne "subject" && $name ne "delimiter") {
    foreach $value (@values) {
      $mailtext = $mailtext.$name;
      $mailtext = $mailtext.$delimiter;
      $mailtext = $mailtext.$value."\n";
    }
  }
}

-------> E-Mail versenden:

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

-------> Dankeseite an Browser senden:

print "Location: $returnhtml\n\n";

  1. Moin.

    Hi ihr fleißigen Forumsbesucher, könnt ihr mir sagen, ob dieser von de.selfhtml.org kopierte Perl Formmailer sichher ist?

    Nö isser nich... Siehe dazu  [Link:http://forum.de.selfhtml.org/archiv/2004/6/t82380/]

    Das bezieht sich auf folgende Zeilen:

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

    Eingaben der Benutzer sollten NIE ungeparsed im header der Mail landen. Und das betrifft nicht nur das To-Feld.

    Das wäre schon besser:

    open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
      print MAIL "To: myMail@my.domain.de\n";
      print MAIL "Subject: Kontaktformular\n\n";
      print MAIL "Original-Subject: $subject\n";
      print MAIL "$mailtext\n";
    close(MAIL);

    Die Empfängeradresse ist hart codiert, ebenso das Subject. Damit der Benutzer aber trotzdem einen Betreff eingeben kann, laß das "Subject"-Feld ruhig im Formular und schreibe das Subject in dem Mailbody. Der Header wird durch die beiden \n\n beendet. Falls Du dem User auch die Möglichkeit geben willst, seine Absenderadresse einzugeben, dann sollte auch die im Mailbody landen. Das erschwert zwar das direkte Antworten auf eine solche Kontaktmail, macht das ganze aber sicherer.

    Gruß Frank

    1. da ich aber vorhatte die Variablen vorher hart zu definieren, wie es auch schon im Code stand :

      my $subject = 'Irgendwas';
      my $mailto = 'Email-Addy';

      vorher zu definieren, somit dem User gar keine chance lasse daran was zu ändern, wäre dann der Formmailer sicher???

      1. Moin.

        dem User gar keine chance lasse daran was zu ändern,

        Hab doch glatt übersehen, daß Du die Felder schon fest verdrahtet hast. Ich dachte, Du hättest einfach den Code kopiert. Dann ist der Formmailer sicher - würde ich sagen. Einziger "Angriffspunkt", der aber nicht wirklich einer ist:

        my $returnhtml = $query->param('return');

        Ein "Fremdnutzer" kann nach dem Senden der Mail an DICH auf eine andere Seite weiterleiten. Wenn Du da flexibel sein willst, gib einfach einen String mit und nimm den im Script als Key in ein fest codiertes Hash:

        my %return = (ret1 => "danke1.html", ret2 => "danke2.html")
        print "Location: $return{$returnhtml}\n\n";

        Das gleiche geht auch gut, wenn Du dem Nutzer die Möglicheit geben willst, eine Zieladresse auszuwählen. Ergänze Dein Formular um ein Select-feld, in dem der User zw. verschieden Adressen wählen kann. nimm als value aber nicht die wirkliche Adresse, sondern einen "Alias" (im Beispiel addr1 und addr2)

        Im Script notierst Du für jeden alias die reale Adresse...
        my %to = (addr1 => "bla@domain.de, addr2 => "blub@domain.de")
        my $mailto = $query->param('mailto');
        To: $to{$mailto}\n";

        Gruß Frank

        1. Ne, E-mail addy kommt aus ner DB, die $returnhtml kommt sehr warhscheinlich nachher auch aus der DB, also alle wichtigen, vorher im <hidden> versteckten Informationen werden fest definiert, bzw. kommen aus einer DB, die aber nicht von außen veränderbar ist.