/blog/perl


substr() in Perl
[127001 mal gelesen]
foreach in Perl
[116149 mal gelesen]
Arrays in Perl - Besonderheiten
[109128 mal gelesen]
open() - Dateien öffnen in Perl
[97739 mal gelesen]
split() in Perl - Zeichenketten teilen
[88645 mal gelesen]
chomp() in Perl
[84410 mal gelesen]
grep - Listen durchsuchen in Perl
[81727 mal gelesen]
push in Perl
[78538 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[61110 mal gelesen]
print in Perl
[49723 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 "Mails versenden mit Perl - Sendmail"

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 "Mails versenden mit Perl - Sendmail" wurde 25167 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

Perl in PHP einbinden

Firefox 3 - Exe-Files downloaden

Hash of Arrays - Oder: Wie bilde ich ein Hash aus Arrays?

Bestimmte Anzahl von Zeilen aus Datei einlesen - Probleme eines Lesers

Was man mit RegEx tun sollte und was nicht - Reguläre Ausdrücke

close - Datei schließen in Perl

Umgebungsvariablen in Perl



0.0307271480560303 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
truncate - Dateigröße verändern in Perl
Eigene IP herausfinden mit Perl
Epoche live in Datum umwandeln
Firefox 3 - Exe-Files downloaden


Von: Fabian
Kommentar:
Hallo zusammen,
ich suche schon etwas im Internet und bin bisher nicht fündig geworden.
Zum Beitrag


Von: Schorschel eastcoast
Kommentar:
Danke. Das hat mir weitergeholfen.
Zum Beitrag


Von: Jessica
Kommentar:
Kann man auch zwei Datein parallel einlesen?

Zum Beitrag


Von: Xtravaganz
Kommentar:
Für

Zum Beitrag


Von: Xtravaganz
Kommentar:
Für

Zum Beitrag



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
22.7.2018

Es ist
8:45:50 Uhr

Ihre IP:
54.198.77.35

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
3687080


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



Mo Di Mi Do Fr Sa So
1
2345678
9101112131415
16171819202122
23242526272829
3031

Impressum