Hell-O!
Reicht es wenn ich den einen Zeilenumbruch entferne? Ist es dann ausreichend validiert?
Nein. Es geht um den Inhalt von $FORM{'Email'} und $FORM{'Name'}. Du musst sicherstellen, dass dieser keine "schädlichen" Zeichen enthält, dazu gehören u.a. Newlines ("\n"). Es ist ein Grundprinzip, dass man Daten, die von außerhalb des Scripts kommen, *nie* ungeprüft einsetzt.
Also aus
print MAIL "Reply-to: $FORM{'Email'} ($FORM{'Name'})\n";
einfach das machen:
print MAIL "Reply-to: $FORM{'Email'} ($FORM{'Name'})";
Damit produzierst du Müll, da eine Headerzeile immer mit einem Newline abgeschlossen werden muss.
Kennst du zufällig einen kostenlosen Formmailer, der nicht so anfällig für Spam ist oder kann man das Script von mir irgendwie anpassen?
Ja, indem du die Daten prüfst, bevor du sie verwendest. Perlsec enthält einiges an Beispielen, wann Daten unsauber ("tainted") und damit potenziell unsicher sind. Ich mache in diesen Fällen eine simple RegExp-Prüfung, die mir nur sagt, ob die Daten sicher sind. Über die Gültigkeit sagt sie natürlich nichts aus:
my $cgi = CGI->new();
if($cgi->param('Email') =~ /^[A-Za-zÄÖÜäöü@.-_]+$/) {
# Eingabe ist sicher, da sie nur zulässige Zeichen enthält
$reply = $cgi->param('Email');
}
else {
# Fehlerbehandlung
}
Das Prinzip ist denkbar einfach: Du überlegst dir, welche Zeichen in deinen Formularfeldern erlaubt sein sollen, schreibst diese in eine Zeichenklasse und prüfst damit die Eingabe. Ich halte diesen Ansatz für sinnvoller als nach unerlaubten Zeichen zu suchen, da es in diesem Fall wesentlich übersichtlicher und einfacher ist festzustellen, was du willst, als festzustellen, was du nicht willst. Und so machst du es mit allen Eingaben.
Siechfred