Tipps zum Verhindern von Spam-Missbrauch der Mailformulare
E-Mail-Injection / E-Mail-Header-Injection
Was ist das?
Der Begriff „E-Mail-Injection“ beschreibt das Ausnutzen einer Sicherheitslücke in einer Webanwendung mit dem Ziel, beliebige E-Mails ohne Wissen oder Einverständnis des Betreibers der Webanwendung zu verschicken. Selbst bei einer fest im Code definierten Empfängeradresse ist dies möglich. Diese Sicherheitslücke entsteht meist durch ungenügend geprüfte Parameter, die der mail()-Funktion von PHP übergeben werden. Ausgenutzt wird das hauptsächlich von Spammern, die unerkannt massenhaft E-Mails versenden wollen.
Wie finden die Spammer die ungesicherten Formulare?
Ähnlich wie Suchmaschinen schicken auch Spammer eigene „Robots“ durchs Netz, um auf Webseiten nach solchen Formularen zu suchen. Sie unternehmen den Versuch automatisiert mit Hilfe eines Scripts eine Testmail über diese Sicherheitslücke zu verschicken und werten das Ergebnis dieses Tests aus, um ein anfälliges Formular später eventuell weiterzuverwenden.
Wie funktioniert das?
Vereinfacht ausgedrückt besteht eine E-Mail aus einem Header- (Kopfzeilen) und einem Body-Teil (dem Nachrichtenteil). Im Header befinden sich u.a. Informationen über den Empfänger, Absender und den Betreff. Im Body der E-Mail steht der eigentliche Mailinhalt. Diese beiden Teile werden durch eine leere Zeile voneinander getrennt.
Wenn jetzt ein Kontaktformular einer Webseite Eingaben vom Benutzer, wie den Betreff oder den Absender, ohne Überprüfung auf Zeilenumbrüche an die mail()-Funktion weitergibt, dann kann ein Angreifer seine eigenen Header-Informationen (z.B. andere Empfänger, eigenen E-Mail-Text) einschleusen. Hier hilft es auch nicht, wenn das Eingabefeld des Webformulars nur eine Eingabezeile bereitstellt. Es ist problemlos möglich Zeilenumbrüche mit einzufügen.
Ein Angreifer benutzt jetzt eines der Felder, die ungeprüft übergeben werden, um eine komplette E-Mail inklusive Header-Informationen, Leerzeile zum Abtrennen des Body-Teils und eigenem E-Mailinhalt einzufügen. Der Rest der ursprünglichen E-Mail wird an die Spam-Mail mit angehangen, ist teilweise auch noch sichtbar, jedoch gibt es für Spammer auch Methoden die übriggebliebene, eigentliche Information aus der E-Mail für den Empfänger des Spams zu verbergen.
Was tut man dagegen?
Sämtliche Informationen, die in den E-Mail-Header gelangen werden (wie z.B. Absender oder Betreff) benötigen keine Zeilenumbrüche. Genau diese Zeilenumbrüche möchte der Angreifer aber einfügen. Man wehrt den Angriff also am Besten ab, indem man das Vorhandensein von Zeilenumbrüchen in diesen Feldern vor dem Abschicken der E-Mail prüft.
Für Dich besteht die Möglichkeit bei uns das JPBerlin Mehlform zu benutzen, um Spam zu vermeiden. Sofern jedoch in einer selbst entwickelten Webanwendung das Mailen sicher gemacht werden soll, müssen die Header-Informationen überprüft werden. Dazu kannst Du folgende Funktionen benutzen:
function removebreaks($value) {
return trim(preg_replace(‚=((||0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i‘, null, $value));
}
function checkbreaks($value) {
return $value === removebreaks($value);
}
Die Funktion removebreaks
nimmt einen Wert entgegen und schneidet alles hinter einem Zeilenumbruch ab, inklusive des Umbruchs. Zurückgeliefert wird der bereinigte Wert.
Mit checkbreaks
lässt sich überprüfen, ob ein Zeilenumbruch vorhanden ist. Damit checkbreaks
funktioniert, muss auch die Funktion removebreaks
vorhanden sein. checkbreaks
liefert die Werte true oder false zurück.
Es bleibt jedem Entwickler selbst überlassen, ob er die Eingaben lieber säubern möchte oder unsaubere Eingaben mit einer Fehlermeldung ablehnt. Wir empfehlen das Ablehnen von unsauberen Daten. Wir möchten Dir an dieser Stelle noch zwei wesentliche Grundsätze der sicheren PHP-Programmierung ans Herz legen: "Traue keinen Daten die einmal beim User waren" und "Daten lieber ablehnen als versuchen, sie zu reparieren."
Weiterführende Links mit detaillierteren Informationen erhältst Du hier:
E-Mail-Injection bei Wikipedia
Um Formulare möglichst spamsicher zu machen, liefert Ned Batchelder eine gute Hilfestellung.