Chactorys Homepage

Auf dieser Seite:
Regular Expressions

Regular Expressions mit dem Spam-Wort-Filter - kurzes Tutorial zum Spamihilator

Einleitung

Im Spam-Wort-Filter kann man Reguläre Ausdrücke (englisch: Regular Expressions oder RegExes) verwenden. Wie man damit Spam-Wörter in E-Mails identifizieren kann, wird in dem folgenden kurzen Tutorial erklärt.

Interessierten Usern stelle ich meine eigene gut gepflegte Spamwortliste unten auf dieser Seite zur Verfügung.

Exkurs: Spam-Wort-Filter

Doch zuerst ein kleiner Abstecher zu Spamihilators Spam-Wort-Filter selber. Übliche Spamwortfilter enthalten eine Liste von Spamwörtern, die typischerweise in Spam-Mails vorkommen. Wenn ein Spamfilter eine Übereinstimmung zwischen einem Wort im Betreff oder im Text einer empfangenen E-Mail und einem Spamwort aus seiner Spamwortliste feststellt, wird die E-Mail als Spam ausgesiebt. Der Spam-Wort-Filter des Spamihilators kann aber noch viel mehr!

Michel Krämers Spam-Wort-Filter gewichtet Spamwörter sinnvoll mit einer Spam-Wahrscheinlichkeit zwischen 0-100%. Nur harte Spamwörter erhalten Werte um 100%, z.B. die beliebte Rolex. Dagegen kann das Wort Überraschung (10%) schon mal in einer regulären E-Mail vorkommen. Erst zusammen mit weiteren Spam-Wörtern wird die Spamschwelle überschritten.

Der Spam-Wort-Filter des Spamihilators arbeitet wie ein Substring-Filter, d.h. er erkennt nicht nur Zeichenketten, die genau dem Spamwort in seiner Liste entsprechen, sondern alle Zeichenketten, auch längere, die das Spamwort enthalten. Dieser Vorteil verlangt andererseits aber auch eine gewisse Vorsicht beim Einsatz des Spam-Wort-Filters, wie folgende Beispiele zeigen. So ist das im Spamwortfilter als Spamwort verwendete werbung auch in der Zeichenkette Bewerbung enthalten, die somit ebenfalls gefiltert wird. Beispielsweise kann die Zeichenfolge sex die Wörter sex, sexy, sexual und weitere filtern. Aber diese Zeichenfolge kommt auch in Verkehrsexperte, Essex, oder Sextant u.a. vor. Das Spam-Wort anal kommt auch in banal, Kanal oder in Analyse und Analgesie vor. Ich habe deshalb die Spamwörter anal, sex und werbung als reguläre Ausdrücke definiert. Mit RegExes kann z.B. der Wortanfang festgelegt werden. Siehe bei den Beispielen unten.

Der Spamwortfilter sucht mit seinen Einträgen nicht case sensible. Man kann also Spamwörter in die Liste eintragen, ohne auf Groß- und Kleinschreibung zu achten, der Spamwortfilter findet alle Schreibweisen.

Daß der Spam-Wort-Filter des Spamihilators reguläre Ausdrücke (Regular Expressions) versteht, ist sehr nützlich, um auch diejenigen Spamwörter zu erfassen, die durch absichtliche Falschschreibung vor einer Entdeckung durch übliche einfache Spamwortfilter getarnt werden. In einem Suchstring kann man in Form einer Regular Expression mehrere Schreibweisen eines Wortes zusammenfassen. Man trägt den Ausdruck in die Spamwortliste ein und aktiviert dort das Kästchen "Regular Expression".

Der Spam-Wort-Filter gehört in der Filterreihenfolge als zweitletzter Filter direkt vor den Lernenden Filter. Er sollte zwar ursprünglich nur in den ersten Tagen nach einer frischen Installation des Spamihihlators schon mal die übelsten Spammails aussieben, solange bis der Lernende Filter nach ein paar Tagen bereits ausreichend gut gelernt hätte und sicher arbeiten würde. Doch mir ist aufgefallen, daß der Spamwortfilter auch langfristig immer mal wieder Spammails rausfischt, die allen anderen Filtern durch die Lappen gegangen sind. Also habe ich die Wortliste von Grund auf überarbeitet, siehe unten bei Kurzanleitung und Download und Beschreibung und Change-Log.

Regular Expressions – Definition

Regular Expressions (Reguläre Ausdrücke, RegExes) sind Ausdrücke, mit deren Hilfe man Zeichenfolgen in Texten suchen kann. Sie werden aus Schriftzeichen, Zeichenklassen/Gruppen, Platzhaltern und Modifikatoren/Metazeichen gebildet.

Regeln

Ein Zeichen durch ein Zeichen finden: Das Zeichen a sucht und findet das erste vorhandene a, z.B. in Hausaufgaben.

Zeichen mit Zeichenklassen/Gruppen finden: [Vv] findet das erste vorhandene V oder v. Der Ausdruck gr[äe]ulich findet das erste vorhandene gräulich oder greulich.

Platzhalter verwenden: \s findet Leerzeichen/Tabs, \b passt zu Wortgrenzen. Der Punkt (.) passt bei allen Zeichen außer Zeilenumbruch.

Wiederholung mit Modifikatoren: Ein nachgestelltes ? bedeutet, dass das Zeichen 0-1 mal vorkommen soll, ein + bedeutet 1 bis beliebig viele Male, ein * 0 bis beliebig viele Male. Haus(aufgaben)? findet das erste vorhandene Haus oder Hausaufgaben.

Greediness (Gier) des Sterns: Der Modifikator * kann sehr gierig sein. Eine RegEx mit einem Stern wählt nicht nur die erste passende Zeichenkette, sondern die längste erste passende. Dadurch kann es zu falsch-positiven Erkennungen kommen. Das Fragezeichen hinter dem Stern *? vermindert die Gier des Sterns.

Metazeichen: Metazeichen sind \, [, ^, $, ., |, ?, *, +, ( und ). \ (Backslash) hebt die Metazeichen auf, z.B. 1\+1 findet 1+1.

Übersicht (ohne Anspruch auf Vollständigkeit)

a sucht und findet a
. findet alle Zeichen außer Zeilenumbruch (Newline)
\d Ziffern
\D Nicht-Ziffern
\w alphanumerische Zeichen und Unterstrich
\W Nicht-\w-Zeichen
\s Whitespaces (Tab, Leerzeichen usw.)
\S Nicht-Whitespaces
\‹ Wortanfang
\› Wortende
\b Wortgrenze
\B Nicht-Wortgrenze
\A Anfang des Strings
\z tatsächliches physikalische Ende des Strings
\Z Ende des Strings, bzw. das Zeichen unmittelbar vor dem Newline am Ende
^ Zeilenanfang, Negativierung
$ Zeilenende
| und-oder
? Buchstabe/Ausdruck vor dem Fragezeichen optional, muß 0-1 mal vorkommen
+ 1 - beliebig viele Male
* 0 - beliebig viele Male
*? das Fragezeichen vermindert die Gier des Sterns
\ hebt die Bedeutung von Metazeichen auf, das sind: ., [, {, (, ), *, +, ?, |, ^, $ und \
[] Zeichenklasse, findet entweder eines oder ein anderes der enthaltenen Zeichen oder Ausdrücke
() Zeichengruppe
{x,y} x- bis y-mal; ",y" optional, {x} x-mal, {x,} x-mal bis beliebig oft
(?i) vor einem Ausdruck findet groß- oder kleingeschriebene Zeichenketten

Beispiele

Das Beispiel "Viagra" dürfte besonders interesssant sein. Es hat mir von allen Regulären Ausdrücken am meisten Kopfzerbrechen bereitet. Ich hatte auch schon etwas Sorge, daß mich Google nur noch unter "viagra" finden würde, oder daß meine Website vom Web of Trust (WOT-Addon des Firefox) gesperrt würde ... Glücklicherweise trat nichts davon ein!

Gesucht werden (1) Viagra, (2) viagra, (3) via gra, (4) via.gra, (5) \/|AGRA, (6) \/I/\GR/\, (7) V1AGRA, (8) vi@gr@, (9) v:agr4, (10) v i a g r a, (11) v.i.a.g.r.a, (12) v_i_a_g_r_a, (13) Via.gr$1.15, (14) / iagra?, (15) viaggggra, (16) Via zqu gra $1, (17) Viagr+Ciali, (18) qviagrax und weitere Varianten.

Die Regular Expression [Vv].?[Ii].?[Aa].?[Gg].?[Rr].?[Aa] aus der ursprünglichen Spamwortliste des Spamihilators findet die Beispiele (1) bis (4), (10) bis (12) und (18). Die Ausdrücke v[\W_]{0,2}[i1][\W_]{0,2}[a@][\W_]{0,2}g[\W_]{0,2}r[\W_]{0,2}[a@] und v.{0,2}[\|li1í\!].{0,2}[a@].{0,2}g.{0,2}r.{0,2}[a@] (u.a. von der Website von Robin Keir, dem Programmierer des beinahe schon legendären Spamfilters K9) erkennen (2) bis (4), (8), (10) bis (12) und (18), bzw. der zweite zusätzlich noch (15).

Meine eigene aktuelle RegExe findet alle mir bekannten Varianten und ist ziemlich gut gegen falsch-positive Erkennungen geprüft. Sie ist allerdings nicht besonders elegant, weil sie drei Varianten aneinanderhängt und dadurch sehr lang geworden ist: (?i)(?s)(((?<!(betalen\s))(((v)|((\\)|(/)|(\\/)))(((\W)|(\s)|(_)){0,6})([ijl1!:;\|]{1,4})(((\W)|(\s)|(_)){0,6})(([a4@]|(/\\)){1,4})(((\W)|(\s)|(_)){0,6})([gq9]{1,4})(((\W)|(\s)|(_)){0,6})((r){1,4}))(?!(mmversion)|(uf)|(au\ssieht)|(u\ssieht)|(abenstr)|(benstr)))|((?<!(betalen\s))((v)((((\s{0,1})(\w{1,3})(\s{0,1}))|((\w)(\s{1,3})(\w{0,1}))){0,1})([ij1])((((\s{0,1})(\w{1,3})(\s{0,1}))|((\w)(\s{1,3})(\w{0,1}))){0,1})(a)((((\s{0,1})(\w{1,3})(\s{0,1}))|((\w)(\s{1,3})(\w{0,1}))){0,1})([gq9])((((\s{0,1})(\w{1,3})(\s{0,1}))|((\w)(\s{1,3})(\w{0,1}))){0,1})(r)((((\s{0,1})(\w{1,3})(\s{0,1}))|((\w)(\s{1,3})(\w{0,1}))){0,1}))(?!(mmversion)|(uf)|(au\ssieht)|(u\ssieht)|(abenstr)|(benstr)))|((?<!(betalen\s))(((v){1,4})(((\W)|(\s)|(_)){0,4})((i){1,4})(((\W)|(\s)|(_)){0,4})((a){1,4})(((\W)|(\s)|(_)){0,4})([gq]{1,4})(((\W)|(\s)|(_)){0,4})((r){1,4})(((\W)|(\s)|(_)){0,4})((a){1,4}))(?!(mmversion)|(uf)|(au\ssieht)|(u\ssieht)|(abenstr)|(benstr)))).

Je umfassendere Zeichenkombinationen eine RegExe erkennt, desto größer ist natürlich die Gefahr einer falsch-positiven Mustererkennung, was dazu führen kann, daß eine gute E-Mail als Spam fehlklassifiziert wird. Setzen Sie daher starke Platzhalter und Modifikatoren wie . oder * mit Bedacht ein!

Weitere Beispiele:

bulgary (?i)\b[b8]+.{0,1}[uv]+.{0,1}[l17\|]+.{0,1}[gq]+.{0,1}[a@(/\\)]r+.{0,1}[yil1!:\|]
casino (?i)[ck]as[il1]n[o0]
cialis (?i)\b(c+.{0,1})([il1!:\|]+.{0,1})((([a@])|(/\\)).{0,8})([l\|]+.{0,1})([il1!:\|]+.{0,1})([s$5])?
credit (?i)\b[ck].{0,1}r.{0,1}[e3€].{0,1}d.{0,1}[il1!:\|].{0,1}[t\+]
mortgage (?i)\b[m]+.{0,1}[oQ0]+.{0,1}[r]+.{0,1}[t\+]?.{0,1}[gq]+.{0,1}([a@]|(/\\)).{0,1}[gq]+.{0,1}[e3€]?
valium (?i)((\bv)|(\\/)).{0,1}([a@4]|(/\\)).{0,1}[l17\|]+.{0,6}[il1!:\|]+.{0,1}[uv]+.{0,1}m+\b
werbung (?i)\bwerbung
**** SPAM **** (?i)(\*){1,12}spam(\*){1,12}

Hilfsmittel

Ausführlichere Anleitungen zur Verwendung von Regular Expressions finden sich z.B. auf den Websites Regenechsen oder Regular Expressions.

Wer selbst Regular Expressions erstellen möchte, findet in dem Computerprogramm The Regex Coach von Edi Weitz einen exzellenten und zuverlässigen Helfer. Das Programm ermöglicht das Testen regulärer Ausdrücke, bei Bedarf auch in Einzelschritten. Das Programm ist Freeware.

Ein einfaches Werkzeug, um selbsterstellte Regular Expressions zu testen, von der Website regular-expressions.info:

Regexp:

Subject string:

Replacement text:

Result:

Andere Web-Regexe-Tester: Regexpal, Debuggex.com, myregextester oder das Firefox-Plugin Regular Expressions Tester.

Download der aktuellen Spamwortliste

Wer möchte, kann meine intensiv überarbeitete und mehrfach getestete Spamwortliste verwenden. Der Download enthält die Datei "spampoints.xml", zuletzt aktualisiert am 04.05.2014, Version 1.22.

Download der Spamwortliste 
    für Spamihilator

Anleitung

Die hier zum Download angebotene Datei ist ein zip-Archiv und enthält die Spamwortliste "spampoints.xml". Diese muß in das Verzeichnis "C:\Programme\Spamihilator", bzw. englisch "C:\Program Files\Spamihilator" entpackt werden. Damit wird die bisherige Datei "spampoints.xml" ersetzt. Nun muß Spamihilator beendet und neugestartet werden.

Selbsterstellte Spamwörter, die in den Spamihilator-Eigenschaften hinzugefügt wurden, bleiben erhalten. Sie sind in einer anderen Datei, der "spampoints_user.xml", gespeichert, die sich im Verzeichnis "C:\Dokumente und Einstellungen\WINDOWS_USER_NAME\Anwendungsdaten\Spamihilator" (Windows XP), bzw. "C:\Users\WINDOWS_USER_NAME\AppData\Roaming\Spamihilator" (Windows 7) befindet.

Anmerkung zur Virenfreiheit

Mein Computer wird mit Windows 7, Service Pack 1 betrieben, dessen Update-Status aktuell gehalten ist. Alle Anwender­programme (neudeutsch "Apps") sind auf neuestem Stand, kontrolliert mit Secunia Personal Software Inspector. Meine Security Suite mit Antiviren-Erkennung, Heuristik, verhaltens­basierter Malware-Erkennung und Firewall-Komponente wird regelmäßig aktualisiert. Neben der Wächter­funktion und regelmäßigen Systemscans tragen gelegent­liche zusätzliche Unter­suchungen mit Rescue-CDs mit aktuellen Viren­signaturen von mindestens zwei Antivirus-Herstellern zur Computer­sicherheit bei. Die Website chactory.de wird mit einem sicheren Passwort gegen mißbräuchliche Verwendung geschützt und regelmäßig auf Intaktheit untersucht.

Trotzdem empfehle ich grundsätzlich immer einen Virencheck jedes Downloads, also selbstverständlich auch meiner hier angebotenen "spampoints.xml"-Datei! Siehe auch bei den Tipps zu Spam und bei den Sicherheitstipps.

Beschreibung der Spamwortliste

Datei: spampoints.xml, zuletzt aktualisiert am 03.08.2012. Qualitätssicherung abgeschlossen.

Die hier veröffentlichte Spamwortliste "spampoints.xml" enthält Spamwörter, deren Value und einen Comment. Dies wird im Folgenden erläutert.

Die Spamwörter stammen im Wesentlichen aus drei Quellen, und zwar aus der ursprünglichen Datei "spampoints.xml" von Michel Krämer, dem Programmautor des Spamihilators, und aus Spammails, die bei mir und bei Patti, einem engagierten Mitglied des Spamihilator-Forums, eingegangen sind. Weitere wichtige Anregungen habe ich auch von Anbuva, Andreas_Z und weiteren Forenadmins und Usern erhalten.

Natürlich unterscheidet sich meine Auffassung von Spamwörtern von der Auffassung anderer Menschen, ich gehe aber von einigen wesentlichen Übereinstimmungen aus. So nehme ich an, daß User des Spamihilators keine Geschäfte aus Angeboten in unverlangt erhaltenen E-Mails machen möchten, denn solche Geschäfte sind fast immer betrügerisch und gefährlich. Ich gehe davon aus, daß Spamihilator-User keine illegalen, gewalt­ver­herrlichenden, rassistischen, porno­graphischen, sexistischen oder Glücksspiele betreffenden Inhalte empfangen möchten. Nach diesen beiden Hauptkriterien habe ich in dem mir zugänglichen Material typische Wörter gesucht.

Bei der Auswahl der Spamwörter habe ich dauernd neu dazugelernt. Neben vielen spamtypischen Wörtern habe ich in letzter Zeit zunehmend häufiger auch spamtypische Phrasen gesammelt. Diese ermöglichen eine eindeutigere Identifikation, kommen aber natürlich in unter­schiedlichsten Varianten vor und schlagen daher seltener an, als einzelne Wörter.

Die Liste enthält inzwischen über 300 Spamwörter. Sie ist einerseits dadurch sehr effektiv, andererseits jedoch auch etwas unübersichtlich. Sie dürfte daher einer individuellen Bearbeitung durch die Nutzer des Spamihilators nicht ganz leicht zugänglich sein.

Die Spamwortliste enthält normal geschriebene Spamwörter und Reguläre Ausdrücke (Regular Expressions, RegExe). Weil verschiedene Spam-Mails die typischen Spamwörter in ganz unterschiedlichen Schreibungen enthalten können, ist es meiner Ansicht nach bei vielen Spamwörtern sinnvoll, unterschiedliche Varianten zu ermöglichen. Weil der Spamwortfilter bereits ein Substringfilter ist, und da er unterschiedliche Groß- und Kleinschreibung miterfaßt, sind viele Spamwörter auch ohne RegExe schon sehr effektiv.

Die Spamwörter erhalten Values (Werte) von 10%, 30%, 70% oder 100%. Nach meiner oben vertretenen Meinung erhalten Spamwörter wie "via­gra" oder "casi­no" den Value 100%. Etwa 100 RegExes aus Spamwörtern oder Spamphrasen werden so bewertet und führen schon alleine zur Filterung der betreffenden Mail als Spam. Gut 100 Ausdrücke werden mit 70% bewertet, können also nicht alleine zur Bewertung als Spammail führen. Die Liste enthält auch 50 Ausdrücke, die nur mit 30%, und 60 Ausdrücke, die nur mit 10% bewertet werden, z.B. "free" oder "gewonnen". Diese Wörter kommen also nur zum Zuge, wenn sie mit anderen verdächtigen Wörtern in einer Spam-Mail stehen und dann zusammen über 100% ergeben. Ich habe bei vielen Wörtern bewußt eher einen schwächeren Value gewählt, als einen zu starken.

In der Datei "spampoints.xml" stehen die Spamwörter und die RegExes im Quoted-Printable Content-Transfer-Encoding Format. Diese xml-Datei ist daher im Grunde unlesbar. In den Spamihilator-Eigenschaften werden die Spamwörter und die RegExes lesbar dargestellt, doch die RegExes sind teilweise so kompliziert, daß man das dahinterstehende Spamwort kaum noch erkennen kann. Eine Idee zur Lösung dieses Problems war die Einführung eines Kommentars (Comment). Dieser enthält das jeweilige Spamwort in lesbarer Form. Soweit ich Michel Krämer, den Programmautor des Spamihilator, verstanden habe, will er in zukünftigen Spamihilator-Versionen die Spamwortliste nur mit Comment und Value anzeigen lassen, und die jeweilige RegExe soll erst sichtbar werden, wenn man ein einzelnes Spamwort bearbeitet. Alex' Tool SpampointsEditor ermöglicht ebenfalls eine übersichtliche Bearbeitung der RegExes. Ich setze ihn inzwischen regelmäßig zur der Bearbeitung meiner Liste ein.

Der Spamwortfilter liest bisher nur den Betreff und den Mailkörper, dies wird aber, soweit ich Michels Antworten richtig verstanden habe, zukünftig auch auf Headerdaten wie Absender und Empfänger ausgeweitet werden. Solange müssen hilfsweise besonders üble und häufige Spamwörter in eine Spamwort-Regel des Regelfilters eingetragen und auf Header-Daten gezielt werden. Siehe auch im Spamihilator-Forum!

Change-Log der Spamwortliste

Grundsätzliche strategische Änderungen oder Änderungen besonders interessanter RegExes sollten hier jeweils dargestellt werden. In meiner Art einfachem Change-Log können jedoch leider nicht alle Änderungen, etwa neue oder geänderte Spamwörter oder Ausdrücke, einzeln dargestellt werden, dazu ist die Spamwortliste einfach inzwischen zu lang geworden.

Eine kontinuierliche Arbeit an der Spamwortliste findet schon seit mehreren Jahren immer wieder statt, intensiviert gegen Ende 2008, dann habe ich die Liste erstmals allen zur Verfügung gestellt. Offensichtlich sind dadurch nicht nur Vorschläge an mich ausgelöst worden, sondern auch die Ansprüche an eine solche Liste gestiegen. Daher habe ich die Liste seitdem wiederholt sorgfältig überarbeitet, falsch-positive Filterungen entfernt und Fehler im Quoted-Printable Format und in den Regular Expressions berichtigt. Die Liste aus Juli 2009 dürfte bereits recht selten zu falsch-positiven Filterungen geführt haben. Die aktuelle RegExe für die "blaue Pille" fand im Verlauf meiner Tests keine Wörter oder Phrasen falsch-positiv mehr.

Und jetzt werde ich mich pensionieren lassen. ;)

Updates

  1. 23.08.09 Ergänzung interessanter Spamwörter und Spamphrasen, teilweise Rückänderung der bisher komplett als RegExe dargestellten Spamwortliste in einfache Spamwörter, um keine Rechenzeit zu verschwenden.
  2. 25.08.09 Fehlerkorrektur und Ergänzung, 28.08.09 Spamwortergänzung, 13.09.09 Ergänzung.
  3. 06.12.09 Fehlerkorrektur nach einer falsch-positiven Filterung, einige Ergänzungen.
  4. 08.12.09 Ein "known bug", der zur falsch-positiven Erkennung einer Variable "$Ex var" führen kann, wenn diese in einer Mail steht, hat noch keine Lösung, das Problem dürfte allerdings sehr selten auftreten.
  5. 22.12.09 Weitere wichtige Spamphrasen, einige Values erhöht, z.B. ****spam**** und x-spam-level: ******** haben jetzt den Wert 100 erhalten!
  6. 06.01.10 Weitere Spamphrasen hinzugefügt, Versionsnummer in Spamwordliste eingetragen (Version 0.9).
  7. 23.02.10 Weitere Spamwörter, doch eine falsch-positive Erkennung eines holländischen Satzes hat noch keine Lösung.
  8. 03.08.12 Die falsch-positiven Erkennungen der "blauen Pillen" sind gelöst!
  9. 21.04.14 Ergänzungen und Änderungen um aktuelle Spamwörter.
  10. 04.05.14 Ergänzungen und Änderungen.

Interessierte User sind herzlich eingeladen, an einer einfachen Qualitätssicherung teilzunehmen! Am Anfang dieses Kapitels ist angegeben, ob die Qualitätssicherungs-Phase einer Spamwortliste läuft oder abgeschlossen ist.

Gesucht werden besonders falsch-positive Filterungen. Wer einen Fehler findet, sollte bitte unbedingt im Diskussionsfaden zur Spamwortliste im Spamihilator-Forum oder per E-Mail an Chactory darüber berichten.