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"*):

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 (1) - (4), (10) - (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) - (4), (8), (10) - (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: (?i)((((v)|((\\)|(/)|(\\/)))+)(.{0,1})([il1!:\|]+)(.{0,6})((([a@])|(/\\))+)(.{0,6})([g]+)(.{0,1})(r+)(.{0,1})(([a@])|(/\\)))|((((v)|((\\)|(/)|(\\/)))+)(.{0,1})([il1!:\|]+)(.{0,1})((([a@])|(/\\))+)(.{0,1})([g]+)(.{0,1})(r+)(.{0,1})).

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!

*) Ich hatte schon Angst, daß mich Google nur noch unter "viagra" findet, oder daß meine Website einfach vom Firefox WOT (Web of Trust) gesperrt würde. Glücklicherweise trat nichts davon 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.

Download einer aktuellen Spamwortliste

Wer möchte, kann meine intensiv überarbeitete und getestete Spamwortliste verwenden:

« spampoints.zip »

Datei: spampoints.xml, zuletzt aktualisiert 23.02.10, 00:01 h. Qualitätssicherung: aktiv (X) abgeschlossen (O).

Anleitung: Spamihilators voreingestellte Spamwortliste befindet sich im Verzeichnis "C:\Programme\Spamihilator" in der Datei "spampoints.xml". Diese Datei kann einfach mit meiner aus der zip-Datei extrahierten "spampoints.xml" ersetzt werden. Danach muß Spamihilator beendet und neugestartet werden, damit die neue Spamwortliste von "spamihilator.exe" auch verwendet werden kann. Zusätzlich können im Spamihilator-Eigenschaftenfenster eigene Spamwörter erstellt werden, diese werden in einer anderen Datei, der "spampoints_user.xml" im Verzeichnis "C:\Dokumente und Einstellungen\USER_NAME\Anwendungsdaten\Spamihilator", gespeichert.

Hinweis: Bisher wird bei einem Update des Spamihilators die jeweils aktuelle "spampoints.xml" im Programmverzeichnis mit der originalen "spampoints.xml" überschrieben. Beim nächsten Update wird Michel Krämer, der Programmautor des Spamihilators, meine überarbeitete Spamwortliste mit dem Setup ausliefern. Dann entfällt zukünftig der Download und das manuelle Einfügen meiner Spamwortliste, es sei denn, ich kann nicht aufhören, sie weiter zu verbessern.

Anmerkung: Mein Computer ist zwar durch eine Firewall, ein regelmäßig aktualisiertes Antivirenprogramm und eine verhaltensbasierte Malware-Erkennung umfassend geschützt. Dennoch empfiehlt sich grundsätzlich immer ein Virencheck jedes Downloads, also 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 23.02.10, 00:01 h. Qualitätssicherung: aktiv (X) abgeschlossen (O).

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 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, gewaltverherrlichenden, rassistischen, pornographischen, 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 unterschiedlichsten 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. Weil jeweils verschiedene Spam-Mails die typischen Spamwörter in ganz unterschiedlichen Schreibungen enthalten, ist es meiner Ansicht nach bei vielen Spamwörtern sinnvoll, unterschiedliche Varianten zu ermöglichen. Da der Spamwortfilter andererseits 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 "viagra" oder "casino" den Value 100%. Etwa 100 RegExes aus Spamwörtern oder Spamphrasen werden so hart 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 Spammails aussieben. 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 zusammen in einer Spam-Mail stehen und dann gemeinsam über 100% ergeben. Ich habe bei vielen Wörtern bewußt eher einen schwächeren Value gewählt.

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. Der Comment enthält das jeweilige Spamwort in lesbarer Form. Soweit ich Michel 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' SpampointsEditor ermöglicht ebenfalls eine übersichtliche Bearbeitung der RegExes. Ich setze ihn inzwischen regelmäßig bei 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.

Change-Log der Spamwortliste

In einer Art einfachem Change-Log können hier 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. Aber grundsätzliche strategische Änderungen oder Änderungen besonders interessanter RegExes sollten hier jeweils dargestellt werden.

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 sorgfältig überarbeitet, falsch-positive Filterungen entfernt und Fehler im Quoted-Printable Format und in den Regular Expressions berichtigt. Die aktuelle Liste aus Juli 2009 dürfte bereits recht selten zu falsch-positiven Filterungen führen. Zuletzt habe ich im August noch zwei letzte Überarbeitungen und Fehlerkorrekturen ausgeführt, und jetzt werde ich mich pensionieren lassen. ;)

Updates:
23.08.09 Ergänzung interessanter Spamwörter und Spamphrasen, Zurückänderung der bisher komplett als RegExe dargestellten Spamwortliste teilweise in einfache Spamwörter, um keine Rechenzeit zu verschwenden.
25.08.09 Eine Fehlerkorrektur und eine Ergänzung.
28.08.09 Eine Spamwortergänzung.
13.09.09 Eine Ergänzung.
06.12.09 Fehlerkorrektur nach einer falsch-positiven Filterung, drei Ergänzungen.
08.12.09 Einen Fehler behoben. 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.
22.12.09 Weitere wichtige Spamphrasen, einige Werte erhöht, ACHTUNG: ****spam**** und x-spam-level: ******** haben jetzt den Wert 100 erhalten!
06.01.10 Weitere Spamphrasen, Versionsnummer eingetragen (Version 0.9).
23.02.10 Weitere Spamwörter. Eine falsch-positive Erkennung eines holländischen Satzes, noch keine Lösung.

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 Spamihilator-Forum oder per E-Mail an Chactory darüber berichten.