Filter für Adblock Plus erstellen

Die aktuellen Versionen von Adblock Plus ermöglichen es, die Filter auf vielerlei Weise zu optimieren. Hier wird nun erklärt, welche Möglichkeiten zur Verfügung stehen und wofür man sie nutzen kann.

Hinweis: Alle hier genannten Filter dienen nur der Veranschaulichung. Sie sind nicht dazu gedacht, wirklich eingesetzt zu werden.

Einleitung in Filtererstellung

Die Möglichkeiten, die in diesem Abschnitt beschrieben werden, sollten für die Benutzer, die nur gelegentlich Filter erstellen, bereits ausreichend sein.

Einfache Filterregeln

Als neuer Adblock-Nutzer nimmt man als Filterregel natürlich einfach die Adresse des Werbebanners, das man blockieren will. Leider ändert sich diese aber meist, wenn man die Seite nochmal aufruft. Beispielsweise könnte die Adresse http://example.com/ads/banner123.gif lauten, wobei es sich bei 123 um eine zufällige Zahlenkombination handelt. In einem solchen Fall hilft es nicht, die komplette Adresse als Filter zu nehmen, man braucht eine allgemeinere Regel — z. B. http://example.com/ads/banner*.gif. Oder vielleicht sogar http://example.com/ads/*.

Bemerkung: Man sollte mit Joker-Zeichen ("*") vorsichtig umgehen. Der Filter http://example.com/* wird wohl die Werbung erfolgreich entfernen, aber auch alles andere, was von example.com kommt, obwohl man es vielleicht noch sehen möchte.

Ausnahmeregeln

Manchmal kann es passieren, dass ein Filter relativ gut und zuverlässig blockiert, aber in einem bestimmten Fall etwas entfernt, was man dennoch sehen will. Man will nun einerseits den zuverlässigen Filter nicht löschen, aber möchte denn blockierten Inhalt auf einer bestimmten Seite betrachten können.

Aus diesem Grund gibt es die Ausnahmeregeln — sie erlauben einem genau festzulegen, wann ein Filter nicht verwendet werden soll. Wenn man z. B. Probleme mit dem Filter adv hat, weil er http://example.com/advice.htmlblockiert, kann man die Ausnahmeregel @@advice. einführen. Ausnahmeregeln unterscheiden sich nicht von anderen Filterregeln; man kann auch hier Joker und reguläre Ausdrücke verwenden. Der einzige Unterschied ist, dass man @@ voransetzen muss, um den Filter als Ausnahmeregel zu markieren. Solche Filter erscheinen grün in der Filterliste.

Exception rules can do more. If you specify $document option you will get an exception for the entire page. For example, if your exception rule is @@||example.com^$document and you open some page from example.com — Adblock Plus will be entirely disabled on this page and nothing will be blocked.

Übereinstimmungen nur am Anfang/Ende der Adresse zulassen

Normalerweise behandelt Adblock Plus jeden Filter so, als ob er am Anfang und am Ende ein Jokerzeichen hätte; so besteht kein Unterschied zwischen den Filterregeln ad und *ad*. In den meisten Fällen ist dies unproblematisch, manchmal möchte man aber, dass nur am Anfang bzw. Ende der Adresse nach Übereinstimmungen mit dem Filter gesucht wird. Beispielsweise könnten Sie sämtliche Flash-Animationen blockieren wollen, aber mit dem Filter swf wird nebenbei auch die Adresse http://example.com/swf/index.html nicht angezeigt.

Um dieses Problem zu lösen, kann man das Pipe-Symbol ("|") am Anfang bzw. Ende des Filters hinzufügen, damit Adblock Plus weiß, dass die Adresse dort wirklich aufhören soll. Somit wird beispielsweise der Filter swf| die Flash-Animation http://example.com/annoyingflash.swf blockieren, aber nicht mehr http://example.com/swf/index.html. Und der Filter |http://boese-domain.example/ wird zwar http://boese-domain.example/banner.gif blockieren, aber nicht http://gute-domain.example/analyze?http://boese-domain.example.

Manchmal will man sowohl http://example.com/banner.gif als auch https://example.com/banner.gif und http://www.example.com/banner.gif blockieren. Mit zwei Pipe-Symbolen ("||") am Anfang des Filters kann man den Anfang des Domainnamens markieren: ||example.com/banner.gif blockiert alle diese Adressen, jedoch nicht http://badexample.com/banner.gif oder http://gooddomain.example/analyze?http://example.com/banner.gif (Adblock Plus 1.1 oder höher wird benötigt).

Platzhalter für Trennzeichen

Oft will man an einer bestimmten Stelle im Filter jedes Trennzeichen akzeptieren. So will man zum Beispiel mit einem Filter sowohl http://example.com/ als auch http://example.com:8000/ blockieren, jedoch nicht http://example.com.ar/. Hier ist das Symbol ^ nützlich, das als Platzhalter für ein Trennzeichen interpretiert wird: http://example.com^ (Adblock Plus 1.1 oder höher wird benötigt).

Ein Trennzeichen ist jedes Zeichen außer Buchstaben, Ziffern oder eines der folgenden Zeichen: _ - . % Das Ende der Adresse wird ebenfalls als "Trennzeichen" akzeptiert. Im folgenden Beispiel sind alle Trennzeichen rot hervorgehoben: http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82. Somit wird diese Adresse von den Filtern ^example.com^, ^%D1%82%D0%B5%D1%81%D1%82^ oder ^foo.bar^ blockiert.

Kommentare

Jeder Eintrag, der mit einem Ausrufezeichen beginnt, wird wie ein Kommentar behandelt und kann beliebigen Text beinhalten. In der Filterliste wird er mit grauer Schrift dargestellt und hat keinerlei Einfluss darauf, was Adblock Plus blockiert. Man kann z.B. einen Kommentar vor einem Filter einfügen, um zu beschreiben, was dieser Filter macht. Kommentare am Anfang einer Filterliste beschreiben normalerweise, wer für diese Filterliste verantwortlich ist.

Special comments

Special comments will only have an effect in downloaded filter lists, not in custom filters. Special comments must be given at the top of the filter list right below the header. They can set a number of parameters for the filter list:

Möglichkeiten für Fortgeschrittene

In dieser Sektion werden Funktionen von Adblock Plus beschrieben, die in der Regel nur von erfahrenen Nutzern und Autoren von Filterlisten eingesetzt. Sie können diese ohne Probleme überspringen.

Filter-Attribute angeben

Adblock Plus erlaubt es, mit einigen Attribute das Verhalten des Filters zu ändern. Diese Attribute können mit Kommas getrennt nach einem Dollar-Zeichen ($) am Ende des Filters aufgelistet werden, z.B.:

*/ads/*$script,match-case

Hier ist */ads/* der eigentliche Filter, script und match-case sind dessen Attribute. Folgende Attribute werden derzeit unterstützt:

Verwendung von regulären Ausdrücken

Wenn man noch mehr Kontrolle darüber haben will, was eine Filterregel blockiert und was nicht, kann man auch reguläre Ausdrücke verwenden. Beispielsweise wird der Filter /banner\d+/ Adressen, die banner123 oder banner321 enthalten, entfernen, die Zeichenfolge banners aber ignorieren. Der Artikel über reguläre Ausdrücke auf Wikipedia erklärt, wie reguläre Ausdrücke aufgebaut sind.

Bemerkung: Aus Geschwindigkeitsgründen wird von der Verwendung von regulären Ausdrücken abgeraten.

Verstecken von Elementen

Grundregeln

Manchmal findet man Werbung, die sich nicht blockieren lässt, weil sie in die Seite als Text eingebunden ist. Wenn man sich den Quelltext der Seite anschaut, findet man beispielsweise folgendes:

<div class="textad">
Cheapest tofu, only here and now!
</div>
<div id="sponsorad">
Really cheap tofu, click here!
</div>
<textad>
Only here you get the best tofu!
</textad>

Die Web-Seite kann nur komplett heruntergeladen werden, somit wird diese Werbung auch immer heruntergeladen. Solche Werbung kann man einzig und allein verstecken, damit sie nicht angezeigt wird. Dafür gibt es in Adblock Plus die Funktion "Verstecken von Elementen".

Die erste Anzeige befindet sich innerhalb eines div-Elements mit Attribut class="textad". Die folgende Regel wird diese Kombination verstecken: ##.textad. Hier markiert ## eine Regel zum Verstecken während der Rest der Regel ein Selektor ist, der das Element auswählt. Genauso können Elemente auch anhand ihres id-Attributes versteckt werden, ###sponsorad wird also auch die zweite Anzeige verstecken. Den Namen des Elements braucht man nicht unbedingt anzugeben, die Regel ##textad wird also auch funktionieren. Und die dritte Anzeige kann man allein anhand des Element-Namens verschwinden lassen, also z. B. mit der Filterregel {4}.

Die Erweiterun Element Hiding Helper hilft dabei, das korrekte Element auszuwählen und die dazugehörige Regel zu schreiben, ohne den Quelltext der Seite begutachten zu müssen. HTML-Grundkenntnisse sind trotzdem empfehlenswert.

Bemerkung: Das Verstecken von Elementen ist völlig anders realisiert als das "normale" Blockieren. Daher werden Jokerzeichen nicht unterstützt.

Regeln auf eine Liste von Domains begrenzen

Normalerweise will man eine konkrete Anzeige nur auf einer Seite verstecken, diese Regel soll nicht auf anderen Seiten angewandt werden. So könnte beispielsweise die Regel ##.sponsor auf einer Seite etwas verstecken, was man eigentlich sehen möchte. Wird diese Regel aber als example.com##.sponsor geschrieben, wird diese nur auf http://example.com/ oder http://something.example.com/ angewandt, jedoch nicht auf http://example.org/. Man kann auch mehrere Domains angeben — einfach mit Kommas trennen: domain1.example,domain2.example,domain3.example##.sponsor.

Wird ein Domainname von “~” angeführt, wird die Regel auf Seiten dieser Domain nicht angewandt (Adblock Plus 1.1 oder höher erforderlich). So wird zum Beispiel ~example.com##.sponsor auf allen Domains außer "example.com" und example.com,~foo.example.com##.sponsor auf der Domain "example.com" mit Ausnahme der Unterdomain "foo.example.com" angewandt.

Bemerkung: Aufgrund der Implementierung kann man die Regeln zum Verstecken von Elementen nur auf ganze Domainnamen begrenzen. Andere Teile der Adresse kann man nicht verwenden, auch kann man domain nicht anstatt von domain.example,domain.test nehmen.

Bemerkung: Regeln, die auf eine Domain beschränkt sind, können auch auf Elemente im Benutzerinterface des Browsers angewandt werden. Beispielsweise wird die Regel browser##menuitem#javascriptConsole den Eintrag für die JavaScript Konsole im Extras-Menü von Firefox verschwinden lassen.

Attribut-Selektoren

Einige Werbefirmen manchen es einem nicht leicht — ihre Textwerbung hat weder ein Attribut id noch class. Eventuell kann man diese aber anhand von anderen Attributen verstecken, die für diese Werbung typisch sind. Beispielsweise wird die Regel ##table[width="80%"] alle Tabellen verstecken, mit width-Attribut 80% verstecken. Man kann auch einen Teil des Attributs festlegen, so wird ##div[title*="adv"] alle div-Elemente verstecken, deren Attribut title die Zeichenfolge "adv" enhält. Man kann auch genauer angeben, dass sich die Zeichenfolge am Anfang bzw. Ende des Attributs befinden soll: ##div[title^="adv"][title$="ert"] wird nur div-Elemente verstecken, deren title-Attribut mit "adv" anfängt und mit "ert" endet. Und wie man hier sieht, kann man mehrere Bedingungen kombinieren, um die Regel spezifischer zu machen — table[width="80%"][bgcolor="white"] wird Tabellen verstecken, die nicht nur Breite 80% haben, sondern bei denen auch die Hintergrunfarbe als weiß angegeben ist.

Fortgeschrittene Selektoren

Im Prinzip kann man jeden CSS-Selektor für Verstecken von Elementen verwenden, der von Firefox unterstützt wird. Zum Beispiel wird folgende Regel alles verstecken, was einem div-Element der Klasse "adheader" folgt: ##.adheader + *. Für eine komplette Liste der CSS-Selektoren siehe CSS-Dokumentation von W3C (es werden noch nicht alle Selektoren von Firefox unterstützt). Please keep in mind that browsers are slower to process these selectors than selectors based on class or id attribute only.

Bemerkung: Diese Funktion setzt etwas Erfahrung voraus. Man sollte sich mit CSS-Selektoren auskenne, da Adblock Plus nicht in der Lage ist, die Syntax zu überprüfen. Wird eine falsche Regel eingegeben, kann das dazu führen, dass auch andere Regeln nicht mehr funktionieren. Man sollte stets die Fehlerkonsole auf CSS-Fehler überprüfen.

Extended CSS selectors (Adblock Plus specific)

Sometimes the standard CSS selectors aren't powerful enough to hide an advertisement. For those cases we have added some new selectors, namely :-abp-has(), :-abp-contains() and :-abp-properties() (requires Adblock Plus 1.13.3 or higher for Chrome and Opera).

When writing an element hiding filter that makes use of these extended selectors you must use the #?# syntax, e.g. example.com#?#selector. But it's important to note that doing so carries a performance impact, so do so sparingly and make sure those filters are specific to as few domains and elements as possible.

:-abp-properties()

:-abp-properties(properties) will select elements based upon stylesheet properties. For example :-abp-properties(width:300px;height:250px;) will select elements that have a corresponding CSS rule in a stylesheet which sets the width and height to the values 300px and 250px respectively. Property names are matched case-insensitively. Furthermore, wildcards can be used so that :-abp-properties(width:*px;height:250px;) will match any width specified in pixels and a height of 250 pixels.

You can also use regular expressions by surrounding the properties expression with "/". For example, :-abp-properties(/width:30[2-8]px;height:250px;/) will match widths between 302 and 308 pixels and a height of 250 pixels.

Note: The older syntax for the CSS property filters is deprecated and will be automatically converted to the new format . The syntax to select the style properties remain the same. For example, [-abp-properties='width:300px;height:250px;'] will be converted to :-abp-properties(width:300px;height:250px;).

:-abp-properties() will also select elements using the style properties found in their pseudo-elements, like ::before and ::after. For example, :-abp-properties(content:'Advertisment') will match elements where the string Advertisment is found in either their ::before or ::after pseudo element.

:-abp-has()

:-abp-has(selector) will select elements based on their content. For example :-abp-has(> div > a.advertiser) will select elements that contain as a direct descendant a <div> that contains an <a> with the class advertiser. The inner selector can be relative to the element scope, and can use any of the pseudo-selectors, including :-abp-has() and will determine whether the selection will occur.

:-abp-contains()

:-abp-contains(text) will select elements based on their text content. For example, div.sidebar > span:-abp-contains(Advertisment) will select the <span> elements within a <div>, with a class of sidebar that contains the word "Advertisment". In practice, you'd want to combine this with a :-abp-has() to select the outer container — something like div.sidebar > div:-abp-has(span:-abp-contains(Advertisment)) to select the container that would contain an advertisement label.

Ausnahmeregeln

Ausnahmeregeln können bestehende Regeln auf bestimmten Seiten deaktivieren. Sie sind meistens hilfreich für Filter-Autoren, um Filterregeln zu erweitern, die sie nicht ändern können. Zum Beispiel kann die Regel ##.textad auf example.com mit der Ausnahmeregel example.com#@#.textad deaktiviert werden. Die Kombination dieser beiden Regeln hat exakt denselben Effekt wie die Regel ~example.com##.textad. Es ist empfehlenswert, Ausnahmeregeln nur einzusetzten, wenn man eine zu allgemeine Filterregel nicht ändern kann, in allen anderen Fällen ist eine Begrenzung des Filters auf die nötigen Seiten besser. These exceptions will be applied to advanced pseudo-selector rules as well.

Generic / Specific filters

With the $generichide and $genericblock filter options the distinction between generic and specific filters becomes important.

We classify a filter to be specific if it matches one or more domains or matches a sitekey. If a filter has no domains specified (or only domain exceptions) and no sitekey then it counts as generic. For example, example.com##.textad is a specific filter, whereas both ##.textad and ~example.com##.textad are generic.

Note that with blocking rules the domain must be specified under the $domain option for them to be considered specific. For example, ||example.com^ is considered generic whereas */ads/*$domain=example.com is site-specific.

Implementing a sitekey on the server

For a sitekey-restricted filter to apply, a webpage needs to return base64-encoded versions of the public key and a signature which Adblock Plus can validate. Currently, this means including them in both the HTTP response header (X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba) and the root tag of the document (<html data-adblockkey="abcdpublickeydcba_abcdsignaturedcba">).

First you need to create a private RSA key (preferably 512 bit to keep the transfer volume low) and then a DER representation of the public key.

The data used for creating the signature is a concatenated list of request variables (namely URI, host and user agent) separated by the NUL character "\0". For example:

  /index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0

Finally, generate the signature for this string by using the signature algorithm SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE (default when using OpenSSL).