Formmailer sind unbestreitbar praktisch, um schnell und bequem eine E-Mail verschicken zu können. Eigentlich sollte fast jede gute Seite eine Kontaktaufnahme über einen Formmailer anbieten. Ich habe meine Hauptseite überarbeitet und dabei auch meinen Formmailer neu geschrieben. Seltsamerweise hatte ich früher nie Probleme mit Spam und Formmailer-Missbrauch, aber seit ich meine Website geupdatet habe, werde ich plötzlich auch Opfer von Spam. Aus diesem Grunde habe ich einen einfachen Spamfilter für PHP geschrieben, aber bevor ich darauf eingehe, ist es sinnvoll, sich erstmal anzugucken, wie E-Mails aufgebaut sind und wie sich Formmailer missbrauchen lassen.
Eine E-Mail besteht zunächst aus einem Kopf, dem Header, dessen Inhalt von den E-Mail-Programmen größtenteils nicht angezeigt wird. Dieser Header enthält Informationen über den Absender, über den Weg, den die E-Mail gegangen ist, wann sie abgeschickt wurde, wer eine Kopie erhalten hat und noch einiges mehr. Der Aufbau des Headers ist durch RFC 2822 spezifiziert. Nach dieser Spezifikation werden die Informationen in Header Fields abgelegt und die Header Fields müssen am Anfang einer Zeile stehen, also am Ende einen Zeilenumbruch beinhalten. Typische Header-Informationen sind From, To, Received und Date. Ein E-Mail-Header sieht durch die Spezifikation ungefähr so wie dieses Beispiel aus:
Um einen Formmailer zu missbrauchen, muss man eine „E-Mail Injection“ machen. Dazu versucht man ganz einfach weitere Header-Informationen in die E-Mail zu schmuggeln.
Einzelne Header-Zeilen werden ja durch Zeilenumbrüche voneinander getrennt, also lassen sich weitere Header-Informationen einfach mit zusätzlichen Zeilenumbrüchen einschleusen. Ein typischer Formmailer besteht aus den Feldern Betreff, Name des Absenders, der Absender-Mail und natürlich dem eigentlichen Text. Um jetzt neben der Absender-Mail noch eine Kopie zu verschicken, braucht man das Formular nur mit dem Header Field cc: oder bcc: „vergiften“. Statt „the_new_strangeness@yahoo.de“ gebe man also „the_new_strangeness@yahoo.de\ncc:nospam@gmx.net“ ein. Dadurch hat man eine Kopie an die E-Mail-Adresse nospam@gmx.net geschickt.
Zwar sind die Felder des Formmailers nur für einzeiligen Text gedacht, aber wie man sieht hält das niemanden davon ab, weitere Zeilenumbrüche einzufügen. Auch ein Wechsel von GET auf POST wird da nicht viel bringen und Lösungen wie Captchas schrecken Besucher ab und sind vom Standpunkt der Barrierefreiheit aus gesehen eine Katastrophe.
Um den Formmailer vor derlei Missbrauch wirksam zu schützen, muss geprüft werden, ob Zeilenumbrüche vorhanden sind, um diese ggf. zu entfernen. Einzeilige Felder wie Betreff, Name des Absenders und Absender-Mail sollten also unbedingt geprüft werden. Der eigentliche E-Mail-Text darf aber Zeilenumbrüche beinhalten.
Darüber hinaus sollte man sich auch nicht auf Felder, die als readonly oder disabled gekennzeichnet sind, verlassen. Diese Sperre lässt sich leicht umgehen und so hat ein Spammer leichtes Spiel, wenn man die E-Mail-Adresse des Empfängers auf diese Weise zu schützen gedenkt. Man sollte die E-Mail-Adresse des Empfängers also unbedingt „hart“ in den Quelltext eingeben und sich nicht auf die Werte der POST- oder GET-Variable verlassen.
Der Spammer oder der Spambot versuchen auszutarieren, ob ein Formmailer für Spammissbrauch anfällig ist. Dazu schreibt er eine E-Mail-Adresse mit ihrer Domain in die Mail und versendet eine Kopie an seine eigene Wegwerf-E-Mail-Adresse. Wenn die E-Mail bei dem Spammer ankommt, dann weiß er, dass sich der Formmailer für Spam missbrauchen lässt. Daraufhin wird über ihren Formmailer Werbung an den Rest der Menschheit verschickt, natürlich nicht mit der E-Mail-Adresse des Spammers, sondern mit ihrer. Ein weiteres starkes Indiz für ein Spamattacke ist also, dass der Absender krude E-Mail-Adressen mit ihrer Domain erfindet. Bei meiner Domain sähe dass dann z.B. so aus: the6482@antikoerperchen.de, e7294@antikoerperchen.de, roth6453@antikoerperchen.de, arconi1639@antikoerperchen.de etc.
Ein weiterer Hinweis auf Spam ist natürlich, wenn in der E-Mail Header Fields auftauchen, die gerne für Spam verwendet werden. Mit cc: und bcc: lassen sich z.B. ganz wunderbar Kopien und damit auch Spam an andere verschicken.
Mein Mini-Spamfilter arbeitet ähnlich wie SpamAssassin nach einem Score-System. Für Auffälligkeiten an der E-Mail, die auf Spam hindeuten, werden Punkte vergeben. Wenn ein bestimmter Punktestand erreicht ist, dann geht der Filter davon aus, dass es sich um Spam handelt. Mein Spamfilter hat 3 Abstufungen:
Eine E-Mail wird als möglicher Spam betrachtet. Die E-Mail wird mit einem Warnhinweis versehen.
Eine E-Mail ist höchstwahrscheinlich Spam. Die E-Mail wird mit einem deutlichen Hinweis auf Spambefund versehen.
Die E-Mail ist Spam und wird nicht versendet.
Und so sieht es im E-Mail-Programm aus, wenn eine E-Mail als Spam erkannt wurde..
Wann welche Stufe eintritt und welche Meldung ausgegeben werden soll, lässt sich leicht im Quelltext einstellen.
Der Filter besteht aus 2 Funktionen. Welche einfach in den bestehenden PHP-Quelltext des Formmailers kopiert werden. Vor der Zeile, in der die E-Mail im Quellcode abgeschickt wird, muss ein Quellcode-Block eingefügt werden:
$spamlevel+=spamlevel_ermitteln( $name, "check_linebreaks", "remove_linebreaks", $name ); $spamlevel+=spamlevel_ermitteln( $absender_mail, "check_linebreaks", "remove_linebreaks", $absender_mail ); $spamlevel+=spamlevel_ermitteln( $betreff, "check_linebreaks", "remove_linebreaks", $betreff ); $spamlevel+=spamlevel_ermitteln( $text, "no_linebreak_check", "no_linebreak_remove", $text ); spamlevel_verarbeitung($spamlevel, $betreff, $text);
Die Variablennamen $betreff, $absender_mail, $name und $text müssen nur noch an die Variablennamen ihres Formmailers angepasst werden und die Zeile $meine_domain="antikoerperchen.de"; sollte ebenfalls auf ihre Domain geändert werden.
Ich habe auch bereits einen richtigen Spamfilter, nämlich SpamAssassin, aber der schleust die E-Mails einfach so durch und erkennt sie nicht als Spam.
Heute ging’s auch schon wieder ab:

Ja, Captchas, aber ich kann da nicht viel zu sagen, weil ich kein großer Befürwörter dieser Technik bin. Wozu quäle ich mich mit Barrierefreiheit herum, kümmere mich um (X)HTML-Validierung, CSS-Layout und das ganze Zeug, wenn ich danach selbst wieder irgendwelche Barrieren einbaue? Das ergibt für mich nicht so viel Sinn. Außerdem will ich nicht, dass wegen eines Spammers alle anderen Leute benachteiligt werden. Häufig lässt sich das Problem auch etwas eleganter umschiffen oder man muss halt per Hand eingreifen. Das ist mir lieber, als allen Leuten deswegen schwer zu entziffernde Captchas aufzuzwingen, die sie vielleicht aus irgendwelchen Gründen (Textbrowser, abgeschaltete Grafiken, sehbehindert…) nicht mal sehen können. Also wie gesagt: barrierefrei ist das lange nicht und ich denke, dass es Besucher eher abschreckt, ein Formular auszufüllen. Ein absoluter Usability-GAU also. Man kann als Alternative noch akustische Captchas einsetzen (also WAV-Dateien, in denen irgendein Codewort vorgelesen wird), aber das ist mir alles zu kompliziert.
Außerdem gibt es bei Captchas auch eine Grenze der Chiffrierung. Wenn es Spammer darauf anlegen und es lohnenswert erscheint, ein Captcha zu knacken, dann können sie es auch. Die Captchas müssen also immer besser werden, um das Reverse Engineering zu erschweren. Dieses Wettrüsten hat aber seine Grenzen, nämlich dann, wenn die Captchas auch von normalen Menschen nicht mehr entziffert werden können. Mich regt es schon auf, wenn ein Captcha so unleserlich ist, dass man ein „B“ nicht von einer „8“ unterscheiden kann und man dann das halbe Formular erneut ausfüllen darf.
Insofern würde ich auf Captchas nur im äußersten Notfall zurückgreifen und nicht sofort bei ein oder zwei punktuellen Spamattacken.
Hallo Dirk,
werde das Ganze auch sofort mal testen … kennst Du rein zufällig ein Script welches die Integration von "Buchstaben-Codes" (visual confirmation) in ein x-beliebiges Script gestattet ?
Beste Grüße,
Manuel
Alles klar, ich danke Euch … die Captchas kannte ich bisher nur als "visual confirmation" … so - dann werde ich das Ganze mal in ein paar Sites implementieren - ist zwar nich barriere- dafür aber stress-frei :-)
Beste Grüße,
Manuel
Hi,
selbst wenn ich diesen Tip so nicht direkt umsetzen kann mangels Möglichkeiten durch den Provider, so ist das dennoch zumindest ein guter Grundlagenartikel, durch den ich hoffentlich bald ebenfalls ein brauchbares Mailformular in meine Website einbauen kann. Spam, der bei mir ankommt, wird sowieso schon rausgefiltert. Und das ziemlich effektiv. Aber solch ein Mailformular als Tarnadresse für einen Spammer ist eine Horrorvision. Es wäre eine Katastrophe, wenn überall unter meiner Domain plötzlich Spam auftauchen würde.
Das, was Du meinst Manuel, findest Du unter dem Stichwort Captcha. Hier bekommst Du so ein Script: http://www.jtr.de/scripting/php/classes/captcha/
danke erst mal für das script!
.. aber wie weiss ich php-rookie nun ob ichs richtig eingebaut habe? wahrscheinlich erst wenn ich sehe ob haufenweise spam reinkommt …
So, hier mal ein kurzer Erfahrungsbericht: Soweit ich feststellen konnte, wird Spam effektiv unterbunden. Probleme konnte ich nirgends feststellen.
Warum benutt Du denn hier auf dem Blog keinen Formmailer?
Ich werde es mal testen, und Dir dann melden, "ob es auch bei anderen Leuten funktioniert"!
So ist es, oder einfach selbst ein paar „\n“s ins Formular knallen und sehen was passiert.
Ich habe das Problem mit den Spam-Kommentaren einfach gelöst. Alle Nachrichten, die http:// beinhalten, werden abgewiesen. Voila
Hallo Dirk,
vielen Dank für diese klare, verständliche Anleitung, die auch mir php-dummie einleuchtet! Danach hab ich jetzt schon mehrere Tage gesucht.
Herzlichen Gruß,
Bettina
Danke, ich hoffe er funktioniert auch bei anderen Leuten, denn bislang habe ich es ja nur bei mir selbst getestet. :-)
Werde ich bei meiner Typo3 Seite auch mal testen. Hört sich viel versprechend an. Bei den phpBB Foren reicht meist schon die *@mail.ru domains zu bannen und die "username" input namen in etwas anderes zu ändern.
Super, genau sowas such ich schon seit ein paar Wochen, musste schon auf 2 Seiten das Formular ausbauen weil ich keinen vernünftigen Schutz hinbekommen habe…
Danke :)
Spannend, das werde ich auf jeden Fall testen und gegebenenfalls einbauen! Wieder einmal ein sehr wertvoller Artikel von Dir Dirk! Thx
Schöne Sache, werde ich mich mal damit befassen. Vielen Dank!
Hallo, ich werde auf meinem billigen Webhosting Paket probieren. Wobei ein Captcha ja schon Skripte killt, die es versuchen. (Mein Webhoster wäre fast durchgedreht bei dem verursachten Traffic auf dem Server durch die Spammer)
Haftet man für solchen Spam mit? Die Schwachstellen müßte man ja als Affiliate eigentlich kennen, oder nicht?
Menü
Beitragsübersicht
Kontakt & Impressum
Über mich
Linkempfehlungen/Linkpartner
Letzte Kommentare
»Vorstellungsgespräch: E…
»Die Krux mit den Hinter…
»Bewerbung: Standard-Abs…
»Glossar: Quirks-Modus (…
»Glossar: Quirks-Modus (…
Meta
RSS 2.0
XHTML-Validierung
CSS-Validierung
Backlinks
»Spam vermeiden
»Internetagentur Ulm
»Bruststraffung
»Achterbahn & Freizeitpark
»Fernstudium
»TuS Graf Kobbo Tecklenburg