Spamkiller RegEX

RegEX-Funktionen sind eine gute Methode, um der Spam-Flut Herr werden. Ein paar Beispiele und Tipps.

Wer seine E-Mail-Adresse veröffentlicht (oder das muss), hat bereits nach kurzer Zeit die digitalen Zecken im Postfach: Schrottmails, die weder bestellt sind noch einen echten Nährwert haben. Die „tollen Produkte“ der Spammer werden massiv beworben, indem aus allen möglichen Richtungen der gleiche Mist angepriesen wird. Allerdings in verschiedenen Variationen, weshalb sie mit einfachen Filtern von diversen E-Mail-Programmen nur sehr schlecht bekämpfbar sind und „durchrutschen“.

Als Betreuer diverser Webseiten und Teilnehmer in Foren bedeutet „durchrutschen“ für mich ein schlechtes Verhältnis zwischen gewollter und unerwünschter Post. Damit der Scheiß´ idealerweise gleich auf dem Server weggehauen wird, bietet mein Provider für die Mailkonten neben den üblichen Filtern „reguläre Ausdrücke“ an, kurz „Regex“ (von regular expressions).

Wir Menschen besitzen die faszinierende Eigenschaft, falsch geschriebene Worte im Kontext „richtig“ zu erkennen. Das fällt präzisen Maschinen schwerer – was sich die Spammer-Community zu Nutze macht. Während einfache Filter das Wort „Bitcoin“ erkennen wenn es genau so geschrieben ist, kann ein regulärer Ausdruck verschiedene Schreibweisen wie „B1tco1n“ oder „Btcoin“ oder „Bit-Conin“ etc. erkennen. Reguläre Ausdrücke sind erweiterte Mustererkenner. Allerdings ist die Nachbildung einer einigermaßen annäherungsweisen menschlichen Mustererkennung auch mit Regex-Ausdrücken nur bedingt erreichbar. Vor allem:

Fehlerhafte reguläre Ausdrücke können „sehr leere“ Postfächer erzeugen.

Nachfolgend eine Näherung zur Aufgabenstellung, „Bitcoin“-Varianten und eine kleiner Ausflug in mögliche Fehler und Problemchen.

Aus diesem Text sollen die Varianten „herausgefischt“ werden:

Birgit will keine Bitcoin / Btcoin / B1tco1n / Bit-Conin /-Werbung mehr erhalten.

 

Regex-Regel Treffer
1 bitcoin /gm (nichts)
2 bitcoin /gmi Bitcoin
3 b.*n /gmi Birgit will keine Bitcoin / Btcoin / B1tco1n / Bit-Conin /-Werbung mehr erhalten
4 b.*n /gmiU Birgit will kein Bicoin Btcoin B1tc1n Bit-Con
5 b[\s1itcon-]*n /gmi Bitcoin Btcoin B1tc1n Bit-Conin (auch „Bit Coin“)
6 b[\sitcon10:-]*n /gmi zusätzlich wird „B1c0in“ und „Btc01n“ gefunden (mit Null statt „o“) und „B:tc0:n“

Was passiert:

  1. Die suche ist „case-sensitive“, es wird zwischen Groß- und Kleinschreibung unterschieden. Daher wird im Mustertext kein Treffer gefunden – dort ist das „b“ ein „B“.
  2. Der Schalter i nach „/gm“ löst das Problem. Jetzt ist groß/klein egal. Das „/gm“ aktiviert die Schalter „alle Treffer suchen“ und „in mehreren Zeilen suchen“.
  3. Die Auswahl ist zu unscharf. Alles zwischen einem „b“ oder „B“ und einem „n“ oder „N“ wird ausgewählt. Weil der Satz mit „B“ anfängt und mit „n“ aufhört, wird er komplett ausgewählt.
  4. Der Schalter U (großes! U) reduziert das übliche „greedy“ (gierige) Auswählen zwar schon deutlich (ungreedy), es wird dennoch zu viel gefunden.
  5. Die Suche wird auf zulässige Zeichen zwischen „b“ und „n“ eingeschränkt. Für gern verwendete Leerzeichen und Tabs wird das Steuerzeichen „\s“ verwendet, dazu die Buchstaben, Zahlen und Zeichen, die vorkommen bzw. erwartet werden können.
  6. Weil das „o“ gern mit einer „Null“ ersetzt wird, gehört das natürlich zum Zeichensatz dazu. Der Doppelpunkt als „i“-Ersatz ist zwar selten, kommt jedoch vor.

Vorsicht!
Wenn ein Händler als Zahlungsoption „Bitcoin“ anbietet, landet seine Auftragsbestätigung mit einem Filter dieser Art im Spam-Ordner!

Die ziemlich zuverlässige Variante 6 sieht wenig intuitiv aus, eher nach wildem Chiffre. Ist es auch. Dennoch lohnt die Beschäftigung mit regulären Ausdrücken. Dafür gibt es einige nützliche Testseiten im Internet:

  • regex101.com ist eine englischsprachige Seite mit ausführlichen Hilfetexten. Oben wird die gewünschte Regel zusammengestellt, unten wird in einem (eigenen) Mustertext gezeigt, was alles damit gefunden wird.
  • regexr.com ist ebenfalls englischsprachig mit Hilfe – es werden verschiedene „Dialekte“ unterstützt.

Es gibt unendlich viele weitere Seiten zum Thema. Diese beiden sind erwähnenswert, weil sie umfangreiche eigene Texte als Muster zulassen. Das ist zweckmäßig, es hilft beim erkennen von Fehlern in der erstellten Regel.

Das Prüfen von möglichst viel „Testtext“ ist unbedingt sinnvoll, damit wirklich nur das gefunden wird, was gefunden werden soll.

Das primäre Problem von Regex ist das erkennen des Musters, für das eine „Regel“ gefunden werden muss. Eine Idee, was mit folgender gefiltert werden soll?

[a-z0-9-\.]*@[a-z0-9]*\.[dcno][eor][tmg]? \gmi

Damit werden E-Mail-Adressen von „de“, „com“, „net“ und „org“-Adressen gefunden. Allerdings auch die Top-Level-Domains (TLDs) „do“ (Domenikanische Republik), „co“ (Kolumbien),„ne“ (Niger), „no“ (Norwegen) und „nr“ (Nauru).

Mit einer etwas besser lesbaren Regel lässt sich die Filterung auf die gewünschten TLDs beschränken:

[a-z0-9-\.]*@[a-z0-9-\.]*\.(de|com|net|org) \gmi

Diese Regel könnte zu dem weiter oben bereits erwähnten „leeren Postfach“ führen, wenn sie Post in den Spam-Ordner verschiebt. Das ist genau genommen eine Regel für erwünschte Post. Zur Abwehr „aller anderen“ lässt sich die Filterwirkung mittels „negativer Vorausschau“ („?!“) umkehren:

[a-z0-9-\.]*@[a-z0-9-\.]*\.(?!(de|com|net|org))...? \gmi

Nach dem Punkt wird alles außer den aufgezählten TLDs erkannt. Allerdings sind Mails von Subdomains ( „adr­@regex.buoa.de“) der gewünschten TLDs damit ebenfalls auf der schwarzen Liste. Sollen diese überleben, muss ein „Rückblick“ ergänzt werden:

[a-zäöüß0-9-\.]+@[a-zäöüß0-9-\.]{2,}(?<=[a-zäöüß0-9-\.])\.(?!(de\s|com\s|net\s|org\s)).{2,3}\s /gmi

Diese Regel berücksichtigt noch einige weitere Aspekte:

  • Vor dem @-Symbol muss mindestens ein zulässiges Zeichen stehen (* → +)
  • Nach dem @-Symbol und vor dem Punkt müssen mindestens zwei zulässige Zeichen stehen (* → {2,})
  • Nach dem letzten Punkt (bei Subdomains) müssen zwei oder drei beliebige Zeichen (.{2,3}) als TLD und ein „Whitespace“ (Tab, Leerzeichen) stehen („.business“ bliebe z.B. unerkannt)
  • Es werden deutsche Umlaute berücksichtigt (eher hypothetisch)

Ich räume ein: das erschließt sich nur wenigen beim Lesen. Damit das einigermaßen nachvollziehbar bleibt, sind die oben genannten Online-Helferlein für „Gelegenheits-Regexer“ der Rettungsanker. Hier können die gezeigten Beispiele natürlich auf Funktion geprüft werden.

Die hier gezeigte Regel-Iteration ist genau so mittels der Online-Helferlein entstanden, weil dort die Mängel mittels mehrerer Test-Einträge sichtbar wurden.

Nachdem es sich bis hier ein wenig zur Demonstration des Machbaren entwickelt hat, nachfolgend noch ein paar einfachere und dennoch nützliche Regeln als Beispiel:

(I[nevstmen]*t).?(P[artne]*r) \gmi
Schmeißt alles weg, das in irgend einer Weise „Investment Partner“-Angebote unterbreitet.
Hier wird gern mit Buchstabenvertauschung und -auslassungen gearbeitet, weil wir Menschen in der Lage sind, zwischen dem richtigen Anfangs- und Endbuchstaben eines Wortes Buchstabendreher und Weglassungen zu überlesen.
^(?!Schlüsselwort|…).* oder (Schlüsselwort|…)
Nur auf die „Betreff“-Zeile angewandt, werden alle Nachrichten an eine dedizierte Adresse automatisch als Spam entsorgt, in denen eines der aufgezählten Schlüsselworte am Zeilenanfang fehlt.

Je nach System wird statt „negative Vorausschau“ (erstes Muster) der Match-Filter beschrieben(zweites Muster) und per Auswahlfeld z.B. mit „trifft nicht auf den regulären Ausdruck zu“ das Gegenteil gemacht.

b[\sitcon10:-]*n /gmi
Nur auf die „Betreff“-Zeile angewandt, werden eine große Zahl„werde mit Bitcoin reich“-Mails in die Tonne getreten. Das Restrisiko, dass ein Händler in der Betreff-Zeile mit Bitcoin-Bezahlung wirbt (s.o.), nehme ich in Kauf.

Die „Schalter“ (\gmi) werden womöglich in der Oberfläche des Prividers durch Auswahlfelder mit Textbeschreibung erzeugt. Ob Wiederholung der Schalter Schwierigkeiten verursachen könnten, ist mir unbekannt.

Weitere nützliche „Formeln“ nehme ich hier gern auf – bitte mit der Kontaktfunktion (unten) zusenden.