Ich habe bereits hier auf die möglichen Risiken von sendmail hingewiesen. Sendmail kann dazu verwendet werden, Spam zu versenden oder auch um Systemdateien auszulesen. Deswegen sollte man alle unzulässigen Zeichen aus extern eingelesenen Parametern am Besten mit einer Fehlermeldung entfernen. Ich habe deswegen aus aktuellem Anlaß das folgende Script nach den mir vorliegenden Erkenntnissen erstellt, so daß ein Mißbrauch ausgeschlossen werden kann.
# gültige Zeichen in Mailadressen sind:
# a-z A-Z 0-9 _ \- \+ \* \$ \. \@
# falls andere Zeichen auftreten -> STOPP
die ('wrong returnadresse') if ($returnadresse=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('wrong to:') if ($to=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('wrong from:') if ($from=~ /[^a-zA-Z0-9_\-\+\*\$\.\@]/);
die ('no mailtext') if ($mailtext eq '');
die ('no subject') if ($subject eq '');
die ('wrong subject') if ($subject=~ /[\n\0\t\r\0\|]/);
Beschreibung
In der Funktion send_mail werden zuerst alle Parameter eingelesen, und zwar in der Reihenfolge:
Returnadresse, falls eine Mail nicht zugestellt werden kann oder der Empfänger antworten will
to, also der Empfänger
from, Absender
subject, Der Betreff
mailtext, der Text der Mail
Jetzt beginnt die Prüfung der Zeichen, bzw. der verwendeten Mailadressen. Zugelassen sind die Zeichen a-z A-Z 0-9 _ \- \+ \* \$ \. \@. Falls ein Zeichen auftritt, das nicht hierrein passt, wird per Fehler abgebrochen!
Zusätzlich wird noch geprüft, ob ein Subject vorliegt und ein Mailtext, wenn nicht, gibt es ebenfalls einen Fehler. Und zu guter Letzt wird ein \n,\0,\t,\r,\0,\| im Subject ebenfalls als Fehler angesehen.
Danach werden verschiedene Möglichkeiten untersucht, an welchem Ort sendmail sich befindet. Falls sendmail nicht gefunden wird, wird per Fehlermeldung abgebrochen.
Falls bis hierhin alle Prüfungen bestanden wurden, kann die Pipe zu sendmail geöffnet und die Mail versandt werden.
Übrigens
könnte man auch noch ein cc: und bcc: in die Mail einfügen, dazu einfach unter
To: $to
Subject: $subject
From: $from
noch die Zeilen
cc: $cc
bcc: $bcc
einfügen. Natürlich sollte $cc und $bcc entsprechend gesetzt werden.
Und noch was: Dieser Mailer versendet Text-Mails, kein HTML oder sowas!
So weit so gut, ich hoffe, das Beispiel ist gut verständlich und kann nachvollzogen werden. Viel Spaß damit!
Kommentare zum Beitrag "sendmail-Script"
Kommentar von Olli
die ('wrong subject') if ($subject=~ /[\n\0\t\r\0\|]/);
Was ist der Unterschied zwischen \0 und \0 ?