Dies ist eine Anleitung für die Bedienung von MediaWiki:Spam-blacklist und MediaWiki:Spam-whitelist. Die weit weniger ausführliche engl. Original-Anleitung findet sich auf mw:Extension:SpamBlacklist#Usage.

Neben Richtlinien, die erklären, wann eine Adresse als sperrwürdig angesehen wird, wird hier beschrieben, wie Eintragungen in die Blacklist oder die Whitelist vorgenommen werden und was dabei berücksichtigt werden muss. Am Ende dieser Seite befinden sich Hinweise über den Spam-Channel.

Richtlinien

Bearbeitet werden können Black- und Whitelist nur von Benutzeroberflächenadministratoren. Alle anderen können Anträge zur (Ent-)Sperrung stellen, siehe MediaWiki Diskussion:Spam-blacklist#Wie funktioniert diese Seite?

Grundsätzlich ist die Blacklist nur eine technische Hilfe, um massenhafte (oder wiederholte) Verlinkungen einzudämmen, die von mehreren Anwendern ausgehen, ohne dass Konsens bzgl. der Aufnahme der Links besteht und ohne dass eine Ansprache Erfolg hatte. Ist ein einzelner Anwender verantwortlich, kann dieser nach einer erfolglosen (aber erfolgten!) Ansprache gesperrt werden, und es ist kein Eintrag in der Blacklist nötig.

Wird ein Eintrag vorgenommen, muss begründet werden, welche Massenverlinkung damit verhindert werden soll. Auf diese Begründung muss auch der Linksetzer hingewiesen werden, damit er sich ggf. dagegen wehren bzw. rechtfertigen kann.

Da die Größe der Blacklist negativen Einfluss (wenn auch nur wenig) auf das Antwortzeitverhalten der Wikipedia hat, sollte eine Website nur zeitweise gesperrt werden, wenn es keine Anhaltspunkte für chronische unerwünschte Verlinkungen gibt. Bei Blacklist-Einträgen, die länger als ein Jahr bestehen sollen, muss explizit der Grund für die besondere Länge angegeben werden (z. B. im Falle von WP-Mirrors oder Shock-Sites).

Da die Entsperrung temporärer Sperren häufig in Vergessenheit gerät, sollte eine temporäre Sperre als solche kenntlich gemacht werden, z. B. in der Zusammenfassungszeile, im Log-Kommentar oder durch einen Kommentar hinter oder über dem Eintrag selbst. So kann ggf. ein anderer Admin den Eintrag nach einer gewissen Zeit wieder entfernen.

Neben der Blacklist existiert auch eine Watchlist, auf der Links eingetragen werden können, für die eine Sperre überzogen wäre, die jedoch weiter beobachtet werden sollten.

Grundvoraussetzung

Neben den erforderlichen Schreibrechten, die man als Admin hat, ist eine Grundvoraussetzung für das Bearbeiten der Black- und Whitelists das Basiswissen über reguläre Ausdrücke. Wer das nicht hat, sollte nicht in der Whiteliste und unter keinen Umständen in der Blacklist herumpfuschen, sondern wie jeder Nicht-Admin einen Antrag auf der Diskussionsseite stellen. Andernfalls könnten die Folgen sein, dass beispielsweise die Blacklist ausgehebelt wird oder im schlimmsten Fall sogar einen Großteil der Wikipedia quasi-gesperrt wird; dazu würde es schon genügen, eine neue Zeile in die Blacklist einzufügen, die lediglich aus einem Punkt (.) besteht.

Im Rest dieser Dokumentation wird also vorausgesetzt, dass man über Basiswissen bzgl. regulärer Ausdrücke verfügt, wie es z. B. in Selfhtml[1] zu finden war. Detaillierter sind beispielsweise die engl. Manuals von Perl[2] oder PHP[3].

Prinzipielles Vorgehen

Sperren (Blacklist)

Die Blacklist, die Whitelist und deren gemeinsames Log (Wikipedia:Spam-blacklist/log) sind separiert, d. h. das Log muss manuell ergänzt werden, nachdem ein Eintrag in die Blacklist bzw. die Whitelist erfolgt ist. Damit ergibt sich das folgende prinzipielle Vorgehen, falls eine neue Adresse per Blacklist gesperrt werden soll:

  1. Wird die Domain oder Teile davon bereits gesperrt? Falls ja, muss i. d. R. kein neuer Eintrag erfolgen, sondern der alte kann abgeändert werden. Nach bisherigen Sperrungen für einen vorgegebenen URL kann mit diesem Tool gesucht werden.
  2. Ist sichergestellt, dass dadurch nicht zuviel blockiert wird? Dazu muss einerseits die Syntax des regulären Ausdrucks gut durchdacht sein (siehe Abschnitt #Syntax) und andererseits via Special:Linksearch (oder crosswiki linksearch) eruiert werden, wo die zu sperrende Adresse überall vorkommt. Dabei kann sich z. B. herausstellen, dass einige Links der Wikipedia nützlich sind, weswegen man den regulären Ausdruck überarbeiten muss.
  3. Da Archiv-Bots wie SpBot keine Diskussionen archivieren können, die gesperrte Links enthalten, müssen jene Links manuell oder via anderem Bot (z.B. CamelBot) entschärft werden, z.B. durch <nowiki></nowiki>. In Artikeln dagegen sollten auf der Blacklist stehende Links weder entschärft noch gelöscht werden, wenn sie WP:WEB genügen.
  4. Falls bereits auf MediaWiki_Diskussion:Spam-blacklist über die Adresse gesprochen wurde, sollte dort über die Sperrung informiert werden.
  5. Auf Wikipedia:Spam-blacklist/log sollte gemäß der dortigen Anleitung die Änderungen an der Blacklist zusätzlich ins Log eingetragen werden. Wer die dortige Vorgehensweise als zu kompliziert empfindet, der kann den Eintrag auch jemand anderem überlassen. In diesem Fall jedoch, ist es wichtig, dass auf MediaWiki Diskussion:Spam-blacklist bei den Anträgen die Gründe für das Sperren genannt werden. Wenn dann jemand anderer den Eintrag im Log vornimmt, kann diese Diskussion verlinkt werden.

Sperren, für die keine Begründung angegeben wird, dürfen jederzeit gelöscht werden.

Entsperren (Whitelist)

Das Entsperren (per Whitelist) macht weniger Arbeit:

  1. Wird die Domain oder Teile davon bereits entsperrt? Falls ja, muss i. d. R. kein neuer Eintrag erfolgen, sondern der alte kann abgeändert werden.
  2. Falls bereits auf MediaWiki_Diskussion:Spam-blacklist über die Adresse gesprochen wurde, sollte dort über die Entsperrung informiert werden.
  3. Auf Wikipedia:Spam-blacklist/log sollte gemäß der dortigen Anleitung die Änderungen an der Whitelist zusätzlich ins Log eingetragen werden. Wer die dortige Vorgehensweise als zu kompliziert empfindet, der kann den Eintrag auch jemand anderem überlassen. In diesem Fall jedoch, ist es wichtig, dass auf MediaWiki Diskussion:Spam-blacklist bei den Requests die Gründe für das Entsperren genannt werden. Wenn dann jemand anderes den Eintrag im Log vornimmt, kann diese Diskussion verlinkt werden.

Syntax

Die Syntax der Blacklist ist mit der Syntax der Whitelist identisch. "Liste" bezieht sich im Folgenden deshalb stets auf beide Listen.

In der Liste wird pro Zeile alles, was hinter "#" steht, als Kommentar angesehen und somit vom Spam-Block-Script ignoriert. Whitespace (Leerzeichen, Tabulatoren, Zeilenumbrüche) am Anfang und Ende des übrig bleibenden Strings wird ebenfalls ignoriert.[anm 1] Alles andere wird jeweils als regulärer Ausdruck interpretiert, der auf URLs angewendet wird. Beispiel:

# Die gesamte Zeile wird als Kommentar angesehen, also ignoriert 
\.example\.net # Ab der Raute (genauer: ab dem Leerzeichen vor der Raute) ist dies wieder ein Kommentar

Die von etwaigen Kommentaren befreiten Zeilen werden vom Spam-Block-Script alle eingelesen und auf folgende Weise zu einem großen regulären Ausdruck verwurschtelt. Zunächst werden automatisch alle Schrägstriche maskiert, d.h. Schrägstriche brauchen nicht manuell maskiert zu werden, sondern sie werden hier standardmäßig literal (also nicht als Meta-Zeichen oder Delimiter, sondern eben einfach als Schrägstriche an sich) interpretiert.[anm 2] Anschließend werden die Zeilen mit ODER "|" verknüpft und schließlich zum Ausdruck

/https?:\/\/[a-z0-9.-]*(zeile 1|zeile 2|zeile 3|...|letzte zeile)/Si

vervollständigt. Es wird also nach "http://" und "https://" gesucht, gefolgt von einem Host und ggf. Pfad, der zu einem der regulären Ausdrücke aus der Liste passt ("pattern match"). Das Protokoll "http://" darf deshalb nicht manuell in die Liste eingetragen werden, und Subdomains brauchen nicht explizit angegeben zu werden, es sei denn, es soll nur eine bestimmte Subdomain ent- bzw. gesperrt werden. Der php-eigene S-Modifier[4] soll bloß eine Geschwindigkeitssteigerung bewirken; der i-Modifier bezweckt Case insensitivity, sodass also standardmäßig Groß-/Kleinschreibung von URL-Bestandteilen nicht unterschieden wird.

Der fertige reguläre Ausdruck wird schließlich auf eine Zeilenumbruch-separierte Liste aller externen Links des von einem Anwender jeweils bearbeiteten Artikel (oder Diskussion) losgelassen. Aus diesem Grund darf der Anchor ^ für den Beginn der Zeichenkette nicht eingesetzt werden.[anm 3]

Die Whitelist hat immer Vorrang vor der Blacklist:
Zuerst werden alle URLs um die Bestandteile gekürzt, die auf der Whitelist enthalten sind, anschließend werden die verbleibenden URLs und die verbleibenden URL-Reste(!) mit der Blacklist abgeglichen. Genaueres dazu kann in der Diskussion [2] nachgelesen werden.

Zusammengefasst
  • Kommentare mit # einleiten,
  • Schrägstriche nicht maskieren,
  • kein "http://" angeben,
  • Subdomain kann weggelassen werden,
  • Groß-/Kleinschreibung egal,
  • ^ als Anchor nicht verwenden.

Beispiele

Anhand einiger Beispiele wird nun die Syntax demonstriert. Es wird dabei zwar stets Bezug auf die Blacklist genommen, für die Whitelist läuft es aber prinzipiell genauso ab, mit dem Unterschied, dass eben nicht ge-, sondern entsperrt wird.

Gesamte Domain sperren

Soll die Website http://www.example.net (und https://www.example.net) samt allen Unterseiten und samt allen Variationen der Subdomains (also z. B. de.example.net etc.) gesperrt werden, so ist dies durch den Eintrag

\.example\.net

zu bewerkstelligen. Die Punkte müssen maskiert werden, damit sie literal und nicht als beliebiges Zeichen interpretiert werden. Hierbei wird allerdings wegen des ersten Punktes z. B. noch nicht die Adresse http://example.net gesperrt. Wird aber der erste Punkt weggelassen, also

example\.net

dann werden zusätzlich auch Domains der Art "nichtexample.net" gesperrt, was man meist nicht möchte. Einen Ausweg bietet hier ein Konstrukt mit dem einprägsamen, wunderschönen Namen "zero-width positive look-behind assertions" (wer nicht weiß, was das ist, es aber anwenden möchte, sollte es sehr gut in den beiden oben genannten englischen Anleitungen[2][3] nachlesen), auf das auch im nächsten kleinen Abschnitt noch mal eingegangen wird. Der Ausdruck damit sähe dann folgendermaßen aus:

(?<=\.|://)example\.net

Damit wird verlangt, dass direkt vor dem Bestandteil "example.net" entweder ein Punkt (\.) oder ein Protokoll (://) steht; in anderen Worten: Damit wird tatsächlich eine gesamte Domain inklusive aller möglichen Subdomains gesperrt, ohne dass etwaige unbeteiligte Domains blockiert werden.[anm 4]

Nur bestimmte Subdomain sperren

Soll die Website http://www.example.net (und https://www.example.net) samt allen Unterseiten gesperrt werden, aber keine Variationen der Subdomain, so ist dies durch den Eintrag

www\.example\.net

einigermaßen zu bewerkstelligen. Damit sind dann z. B. "de.example.net" und "en.example.net" erlaubt. Zwar werden mit dem Ausdruck nun Domains der Art "irgendwaswww.example.net" gesperrt, das sollte jedoch in den meisten Fällen keine Probleme bereiten. Falls doch, kann man sich entweder über die Whitelist behelfen oder aber schon wieder mittels einer zero-width look-behind assertion (siehe voriger Abschnitt); entweder positiv

(?<=://)www\.example\.net

oder negativ

(?<!ausnahme_1|ausnahme_2|...|ausnahme_n)www\.example\.net

Im ersten, positiven Fall wird verlangt, dass bei zu sperrenden URLs direkt vor dem "www" die Zeichenfolge "://" steht. Im zweiten, negativen Fall wird dagegen postuliert, dass vor dem "www" keiner der Zeichenketten "ausnahme_1", "ausnahme_2", ... oder "ausnahme_n" stehen darf, ansonsten paßt das Muster nicht (kein "pattern matching"), also auch nicht blockiert.

Unterseiten

Soll die Website http://www.example.net/boese_unterseite (und https://www.example.net/boese_unterseite) samt allen Unterseiten gesperrt werden, so kann dies durch den Eintrag

www\.example\.net/boese_unterseite

bewerkstelligt werden. Der Schrägstrich braucht hier wohlgemerkt nicht maskiert zu werden. Damit werden zwar potenziell auch (andere) Unterseiten gesperrt, die genauso beginnen, also z. B. www.example.net/boese_unterseite_ist_gar_boese, aber das nimmt man meist in Kauf. Ansonsten kann man sich wieder der lustigen Zauberdinger, ja genau, der zero-width negative look-ahead assertions, bedienen:

www\.example\.net/boese_unterseite(?![^/])

Die doppelte Negation ist hier beabsichtigt.

Ambivalente Websites

Gelegentlich kommt es vor, dass domains sowohl gute als auch besonders schlechte Unterseiten beherbergen. In diesem Fall gibt es unterschiedliche Vorgehensweisen. Wenn beispielsweise die Website nur wenige schlechte Seiten enthält, so kann man diese explizit aufführen, z. B.

example\.net/pfad1/boese_seite1\.htm
example\.net/anderer_komplett_boeser_pfad(?![^/])
example\.net/pfad3/boese_seite3\.php

oder kombiniert

example\.net/(?:pfad1/boese_seite1\.htm|anderer_ganz_boeser_pfad(?![^/])|/pfad3/boese_seite3\.php)

Falls umgekehrt eine Website nur aus wenigen guten und überwiegend bösen Seiten besteht, so kann einfach die gesamte Domain gesperrt und die wenigen Ausnahmen auf der Whitelist eingetragen werden.

Es gibt jedoch auch Websites, die viele gute und viele böse Seiten enthalten. Wenn man die bösen (alternativ die guten) anhand bestimmter Muster erkennen kann, also anhand von häufig vorhandenen Bestandteilen, dann lässt sich eine gezielte Sperre recht leicht umsetzen, z. B.

example\.net/.*(?:boese|schlimm|uebel)

Speed-up und Tricks

Sooo wichtig ist es vermutlich nicht, aber auf die Laufzeit zu achten, sollte auf jeden Fall nicht schaden. Was gibt es da zu beachten? Nun, zum einen sind non-capturing patterns (der unbedarfte aber geneigte Leser darf wieder im Perl-Manual[2] nachschlagen) meist schneller als capturing patterns, das heißt, es ist besser, (?:foo|bar) statt (foo|bar) zu schreiben. Außerdem sind die Quantoren + und * möglichst spärlich einzusetzen. Werden mehrere ähnliche URLs gesperrt, bietet es sich meist an, diese nicht in separaten, sondern durch Gruppierung in möglichst wenigen regulären Ausdrücken auszudrücken. :-)
Statt der Einträge

example\.net
example\.org
example\.com

sollte besser der Eintrag

example\.(?:com|net|org)

erfolgen, was von der RegExp-Engine deutlich schneller abgearbeitet werden kann.

Die verwendete Engine ist übrigens die von PHP (PCRE), d. h., es ist alles an regulären Ausdrücken erlaubt, was in PHP z. B. in preg_match erlaubt ist.

Für umfangreiche Recherchen, welche Links wie oft von welchen Anwendern wikpedia-weltweit gesetzt wurden, bietet m:SWMT/IRC einige Tools.

Chat – Weblink-Beobachtung per IRC

Außerhalb der deutschsprachigen Wikipedia

Zu nennen sind hier auf Meta-Ebene die Channels

und die Channels der englischen Wikipedia

m:user:Mike.lifeguard stellt für all diejenigen, die sich näher mit dem Thema Spambekämpfung auf Meta-Ebene befassen möchten, einen Screencast darüber bereit.

Mehr Info zur Meta-Vandalismusbekämfung gibt's auf m:Countervandalism Network.

Referenzen

  1. – Perl: reguläre Ausdrücke
  2. a b c perldoc perlre
  3. a b php.net
  4. Näheres über die Modifiers liefert das PHP-Manual [1].

Anmerkungen

Diese technischen Anmerkungen sind nur für jene gedacht, die sich intensiver oder hintergründiger mit der Sache auseinandersetzen möchten. Fürs reine Benutzen der Black- und WhiteLists sind die Anmerkungen nicht notwendig.

  1. Siehe Source Code, function stripLines: trim(preg_replace('/#.*$/', '', $line));
  2. Es erfolgt genauer sogar Folgendes (automatisch): s~\\*/~\\/~g (Perl-Syntax)
  3. nach bug 21387 wurde in revision 60869 (2010-01-09) das zeilenende-zeichen $ nutzbar gemacht, da seitdem der m-modifier standardmaessig gesetzt wird.
  4. \b wird häufig in anderen Wiki-Blacklists verwendet, bringt aber nicht so viel, wie man vermuten könnte, weil z. B. das Minuszeichen in Domains vorkommen darf.