/blog/perl


substr() in Perl
[154074 mal gelesen]
foreach in Perl
[129152 mal gelesen]
Arrays in Perl - Besonderheiten
[125337 mal gelesen]
split() in Perl - Zeichenketten teilen
[113534 mal gelesen]
open() - Dateien öffnen in Perl
[108974 mal gelesen]
grep - Listen durchsuchen in Perl
[94702 mal gelesen]
chomp() in Perl
[93629 mal gelesen]
push in Perl
[90848 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[75965 mal gelesen]
index() in Perl - Zeichenkette in Zeichenkette suchen
[59537 mal gelesen]


Arrays
Dateien
HTPC
Hashes
Leistungsoptimiert
PHP
Perl
RegEx
Schleifen
Script
Skalare
Sonstiges
System
Webserver
Zur Startseite


Donnerstag, 22.3.2007, 13:27:48 Uhr

Mails versenden mit Perl - Sendmail


Jeder, der Perl dazu verwendet, um Internetseiten zu betreiben bzw. Internetdienste betreibt, steht irgendwann vor dem Problem, daß er auch mal eine oder auch mehrere Emails versenden will bzw. muß.

Der meist verwendete Ansatz ist die Verwendung von sendmail. Sendmail ist ein Systemdienst von Unix bzw. Linux (das ja ein Unix-Derivat ist).
Eine Lösung könnte z.B. so aussehen:

$text="Dies ist der Text, der versendet werden soll. Natürlich ist dies nur zum Ausprobieren gedacht";

$SENDMAIL='/usr/sbin/sendmail';
open (SENDMAIL,"|$SENDMAIL -t -f -odq meine.mailadresse\@mein-server.de") || &fehler("Kann sendmail nicht öffnen");
print SENDMAIL <<EOF;
To: $sendto
Subject: $subject
From: meine.mailadresse\@mein-server.de
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit


$text
EOF

close SENDMAIL;


Auf diese Art und Weise eine Mail zu verschicken ist eigentlich Standart und wird noch oft in Scripten gefunden.
Sie birgt jedoch vielerlei Risiken:
Sie ist anfällig für Spam
Es gibt ja so Schlaumeier, die meinen, die Ganze Welt mit Viagra und so'n Gedöns beglücken zu müssen. Dazu werden millionenfach Emails versendet, in der Hoffnung, daß es ein paar Leute gibt, die dann was kaufen. Für den Versender der Mails ein gutes Geschäft, da solche Mails kein Geld kosten und automatisiert ablaufen.
Das Problem ist jedoch, daß man Server braucht, um Mails zu versenden. Und hier liegt eine Gefahr von sendmail: Unsauber programmierte Scripte können als Spamschleuder verwendet werden.
Ich hatte das Problem auch mal und hab dann in Verbindung mit meinem Hoster herausgefunden, was schief läuft.

Und zwar sah mein Script folgendermaßen aus:


use CGI;
$query=new CGI;
$sender = $query->param('sender');
$text=$query->param('text');

$SENDMAIL='/usr/sbin/sendmail';
open (SENDMAIL,"|$SENDMAIL -t -f -odq meine.mailadresse\@mein-server.de") || &fehler("Kann sendmail nicht öffnen");
print SENDMAIL <<EOF;
To: meine.mailadresse\@mein-server.de
Subject: Kontaktformular
From: $sender
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit


$text
EOF

close SENDMAIL;


Dies war ein Script für ein Kontaktformular, ein Formular also, in dem jemand einen Kommentar und seine Absender-Mailadresse eingeben konnte. Dieses Formular leitete dann eine Mail an mich weiter. Funktionierte auch wunderbar und ist auf den ersten Blick eigentlich Idiotensicher. Meint man zumindest.
Bis mein Hoster mich anrief und meinte, über das Script wurden eben Zigtausend Mails versand und ob ich nun in Viagrahandel eingestiegen bin...

So, wo lag nun das Problem? Zuerst natürlich an dem Typen der die Mails versand hatte. Aber das brachte mich ja nun auch nicht weiter. Wo lag also das Sicherheitsloch im Script?
Nochmal zur Funktion des Scriptes: Es wird der Text und der Absender als Parameter eingelesen, das ist auf den ersten Blick schon mal ein Sicherheitsrisiko. Dann wird eine Mail an MEINE Adresse versendet, die war sogar fest eingegeben, ohne Variable. Lediglich die Absenderadresse war "variabel". Aber wo hat der Absender etwas mit dem Empfänger zu tun, denn Sinn des Spams ist es ja, daß viele Leute die Mail kriegen sollen, und nicht ich in Millionenfacher Ausführung.

Also Serverlogs gewälzt, und siehe da, etwas fiel auf: Natürlich wurde das Script direkt aufgerufen, also nicht über die Kontaktseite. Aber das war eh klar. Und noch was fiel auf: Die übergebene Parameter hatte eine Form, so daß hinter 'sender' nochmal ein to: eingeführt wurde.
Wie das nun ging, zeige ich nun nicht, weil ja die bösen Buben mitlesen. Jedenfalls stellte sich heraus, daß man dem eigentlichen from: noch ein to: mit beliebig vielen Mailempfänger anhängen konnte und sendmail hat das brav mitgemacht, laut Hoster ist das sogar ein "feature" von sendmail (da fällt mir ein Spruch von früher ein: Es ist kein bug, es ist ein feature... haha ...).

Wenn man also etwas per sendmail versendet, sollte man UNBEDINGT darauf achten, daß die Parameter nicht gefakt werden können.
Also |, %00 und Zeilenumbrüche sowie alles ausfiltern, was nicht in ein to: oder from: oder subject: oder cc: oder bcc: (hab ich was vergessen?) hineingehört oder besser erkennen und per Fehler abbrechen! Denn wenn da was drin steht, was da nicht hineingehört, ist es wahrscheinlich ein Spamversuch!


Sendmail ist fehleranfällig und läuft nicht auf allen Servern
sendmail ist ein Systemdienst von Unix, meist unter /usr/sbin/sendmail zu finden. Aber eben nur meist, manchmal auch wo anders. Das heißt: Fehlermeldungen! Und zum Anderen läuft es nicht unter Windows, da Windows sendmail nicht kennt. Also blöd, wenn man grad nicht weiß, auf welcher Maschine das Script mal laufen soll... Das kann man natürlich per Software-Abfragen ausbgeln, aber nee, ist nicht der richtige Weg!


Die Verwendung von sendmail ist also relativ einfach, man sollte aber ungebingt auf eine gute Implementierung achten!

Wie man es machen könnte, sehen Sie hier



Kommentare zum Beitrag ""

Kommentar von Renee Bäcker
Man sollte lieber Module anstatt Sendmail direkt verwenden. Zum Beispiel MIME::Lite oder Mail::Sender.

Zum Überprüfen der Mail-Adressen sollte man sich auch nicht auf eine relativ einfache RegEx verlassen. Die RegEx, die auf RFC822-Konsistenz überprüft ist ziemlich lang. Auch hier gibt es Module wie Mail::RFC822::Address.

Und wenn man doch mit Sendmail arbeiten will, sollte man die Option "oi" verwenden.

Kommentar von Admin
Wie gesagt, ich selbst halte sendmail auch nicht für das Gelbe vom Ei, aber mir ist es auf verschiedenen Maschinen schon passiert, daß ich darauf zugreifen mußte, weil o.g. Module nicht vorhanden waren.
Prinzipiell kann ich aber nur zustimmen: sendmail ist fehleranfällig und kann zum Versenden von Spam verwendet werden, man sollte also unbedingt o.g. Module verwenden, falls diese vorhanden sind.

Noch etwas zu sendmail:
Es gibt ja in sendmail noch unzählige "Schalter", aber selbst diese funktionieren nicht auf allen Servern, wie ich aktuell auf dem hier laufenden feststellen muß...

Kommentar von Renee Bäcker
Ja, dass verschiedene Optionen nicht überall funktionieren ist mir auch schon passiert. Das kann ein echtes Problem sein und lange Fehlersuche bedeuten (man vermutet ja doch erstmal den Fehler im eigenen Code und nicht in fehlenden sendmail-Optionen).

Kommentar von alex
Vorallem den Sendmail-Parameter -t raus nehmen!!! Sehr gefährlich!


Siehe man sendmail
-t Extract recipients from message headers. These are added to any recipients specified on the command line.

Damit macht mans Spammer leicht!

Kommentar von Bastian
Tja, etwas spät. Aber trotzdem.

Eine andere Möglichkeit wäre die Option -t bei sendmail weg zu lassen. Dann wird nur an den Empfänger verschickt, der auf der im Parameter von sendmail angegeben wird, und es wird nicht noch versucht, andere Empfänger aus dem Header der Email zu extrahieren.

Hab ich nicht getestet, sollte aber doch eigentlich funktionieren.

MfG Bastian



Thema: Perl System Script

Der Beitrag "" wurde 29903 mal gelesen.

Es wurde 6 x über diesen Beitrag abgestimmt.
Die durchschnittliche Beurteilung liegt bei
1.3 (1 = sehr gut - 6 = grottenschlecht).

Kommentar schreiben  Druckansicht  Seitenanfang 
Beurteilen 






 Zufällige Beiträge im /blog/perl

abs() in Perl - Absolutwert einer Zahl ermitteln

Praxisbeispiel: Wörter extrahieren aus Text

Net::FTP unter Windows Vista

LWP::Simple - Modulbeschreibung in Deutsch

each() in Perl - Wertepaare aus Hash auslesen

Unicode mit Perl - Einfache (?) Anwendung

Gefälschte Mail von Google enthält Trojaner

abs() in Perl



0.0381200313568115 sec. to build



...Blogsoftware in pure Perl - Powered by a lot of Coffee...


SSD-Festplatte - Wassn das???
Die Transliteration - Nur ein Zeichen in einem Skalar ersetzen
Select - Case in Perl
Windows 7 XP Mode – Wo finde ich den XP-Modus unter Windows 7?
Mac-Adresse beim Apple Macintosh herausfinden
SGN-Funktion für Perl

Eigene IP herausfinden mit Perl
Epoche live in Datum umwandeln
Firefox 3 - Exe-Files downloaden


Gesamtverzeichnis
Februar 2010
Dezember 2009
Oktober 2009
Januar 2009
Dezember 2008
November 2008
September 2008
August 2008
Juli 2008
Juni 2008
Mai 2008
April 2008
Januar 2008
Dezember 2007
November 2007
Oktober 2007
September 2007
August 2007
Juni 2007
Mai 2007
April 2007
März 2007
Februar 2007
Januar 2007
Dezember 2006


Mister Wong

RSS-Feed

Heute ist der
10.11.2024

Es ist
8:45:34 Uhr

Ihre IP:
44.211.34.178

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
4422616


Webseiten vergleichen
Kalender mit Feiertagen - 2028
Links finden und testen
Menschliche Datumsangaben
IP zu Domain herausfinden
Time live in Datum umwandeln
Perl für Windows



Impressum