Artikel im Internet unter http://www.hidemail.de/blog/sendmail-script-perl.shtml.
Freitag, 23.3.2007, 10:31:07 Uhr

Sicheres sendmail-Script


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.

#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "<HTML>\n<HEAD>\n";

use strict;
&send_mail(
'returnadresse@server.com',
'empfaenger.adresse@seinserver.com',
'absenderadresse@meinserver.com',
'Subject',
'Mailtext'
);


print "OK, Mail versandt...";

sub send_mail{
local *SENDMAIL;
my $ok='';
my $SENDMAIL='';

my $returnadresse=shift;
my $to=shift;
my $from=shift;
my $subject=shift;
my $mailtext=shift;

# 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\|]/);

my @sendmails=(
'/usr/sbin/sendmail',
'/usr/bin/sendmail',
'/usr/lib/sendmail'
);

# prüfen, wo sendmail sich befindet
foreach (@sendmails){
if (open (SENDMAIL,"|$_ -t")){
$SENDMAIL=$_;
close SENDMAIL;
last;
}
}

die ('Can not find sendmail!!!') if ($SENDMAIL eq '');

open (SENDMAIL,"|$SENDMAIL -t -f $returnadresse") || die('can not open sendmail');
print SENDMAIL <<EOF;
To: $to
Subject: $subject
From: $from
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit


$mailtext
EOF
close SENDMAIL;
}


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!


Artikel im Internet unter http://www.hidemail.de/blog/sendmail-script-perl.shtml.