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.html
blockiert, 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:
-
! Homepage: http://example.com/
This comment determines which webpage should be linked as filter list homepage.
-
! Title: FooList
This comment sets a fixed title for the filter list. If this comment is present the user will no longer be able to change the title.
-
! Expires: 5 days
This comment sets the update interval for the filter list, the value can be given in days (e.g.
5 days
) or hours (e.g.8 hours
). Any value between 1 hour and 14 days is possible. Note that the update will not necessarily happen after this time interval. The actual update time is slightly randomized and depends on some additional factors to reduce server load. -
! Redirect: http://example.com/list.txt
This comment indicates that the filter list has moved to a new download address. Adblock Plus will ignore any file contents beyond that comment and immediately try downloading from the new address. In case of success the address of the filter list will be updated in the settings. This comment is ignored if the new address is the same as the current address, meaning that it can be used to enforce the "canonical" address of the filter list.
-
! Version: 1234
This comment defines a numerical version of the filter list. This version number will be displayed in issue reports and can be used to verify that the report refers to the current version of 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:
- Typ-Attribute: bestimmen, welche Element-Typen von dem Filter blockiert (oder im Fall von Ausnahmeregeln von der Blockierung ausgenommen) werden können. Man kann mehrere Typ-Attribute kombinieren, um den Filter auf mehrere Element-Typen anzuwenden. Mögliche Typen:
script
— externe Scripte, die mit dem HTML-Tag "script" geladen werdenimage
— normale Bilder, in der Regel mit dem HTML-Tag "img" eingebundenstylesheet
— externe CSS-Dateien (Cascading Style Sheets)object
— Inhalte, die von Browser-Plugins dargestellt werden, wie z.B. Flash oder Javaxmlhttprequest
— requests started using theXMLHttpRequest
object orfetch()
APIsubdocument
— eingebettete Seiten, in der Regel per HTML-Frames eingebundenping
— requests started by<a ping>
ornavigator.sendBeacon()
(Adblock Plus 2.7.1 or higher required)websocket
— requests initiated viaWebSocket
object (Adblock Plus 2.8 or higher required)webrtc
— connections opened viaRTCPeerConnection
instances to ICE servers (Adblock Plus 1.13.3 for Chrome and Opera, 3.0 for Firefox, or higher required)document
— die Seite selber (nur Ausnahmeregeln werden auf die Adresse der Seite angewandt)elemhide
— nur für Ausnahmeregeln; ähnlich wiedocument
, deaktiviert aber nur Regeln zum Verstecken von Elementen auf der Seite, anstatt alle Filterregeln zu deaktvieren (Adblock Plus 1.2 oder höher notwendig)generichide
— for exception rules only, similar toelemhide
but only disables generic element hiding rules on the page (Adblock Plus 2.6.12 or higher required)genericblock
— for exception rules only, just likegenerichide
but disables generic blocking rules (Adblock Plus 2.6.12 or higher required)popup
— pages opened in a new tab or windowother
— andere Arten von Anfragen
background
,xbl
anddtd
are outdated and should no longer be used. - Inverse Typ-Attribute: geben Element-Typen an, auf die der Filter nicht angewandt werden soll. Mögliche inverse Typ-Attribute:
~script
,~image
,~stylesheet
,~object
,~xmlhttprequest
,~subdocument
,~document
,~elemhide
,~other
,{10}
- Einschränkung auf Elemente von Drittseiten/der Ursprungsseite: Wenn das Attribut
third-party
angegeben ist, wird der Filter nur auf solche Anfragen angewandt, die nicht an die Domain der gerade betrachteten Seite gehen. Dementsprechend bedeutet das Attribut~third-party
, dass der Filter nur auf Anfragen angewandt werden sollte, die an die Domain der betrachteten Seite gehen. - Domain-Einschränkungen: Das Attribut
domain=example.com
bedeutet, dass der Filter nur auf Seiten aktiv werden sollte, die zur Domain "example.com" gehören. Mehrere Domains können mit dem Zeichen "|" getrennt werden: mit dem Attributdomain=example.com|example.net
wird der Filter nur auf Domains "example.com" und "example.net" angewandt. Wird ein Domainname von "~" angeführt, wird der Filter auf Seiten dieser Domain nicht angewandt. Zum Beispiel bedeutetdomain=~example.com
, dass der Filter auf allen Domains außer "example.com" angewandt werden soll. Unddomain=example.com|~foo.example.com
beschränkt den Filter auf die Domain "example.com" mit Ausnahme der "foo.example.com" Unterdomain. -
Sitekey restrictions: The option
sitekey=abcdsitekeydcba
means that the filter should only be applied on pages that provide a public key and a signature which can be verified by that very same public key that is also contained in the filter (but without the trailing =). Multiple sitekeys can be specified using "|" as separator: with the optionsitekey=abcdsitekeydcba|bcdesitekeyedcb
the filter will only be applied on pages providing either sitekey "abcdsitekeydcba" or "bcdesitekeyedcb". This is similar to domain restrictions but allows covering scenarios where a single filter should apply to a very large number of domains. Note that sitekey restrictions require modifications on the server-side. -
Content Security Policies: The option
csp=script-src: 'none'
causes a Content Security Policy header ofscript-src: 'none'
to be injected into HTTP responses for requested documents matching the filter — assuming that exception rules with the same option don't also match and that the document isn’t whitelisted. The Content Security Policyscript-src: 'none'
would in turn block all scripts — including inline — for the document. This filter option should generally be avoided, except as a last resort to counter advanced circumvention. (Adblock Plus 3.1 or higher required.) match-case
— dieses Attribut sorgt dafür, dass Groß- und Kleinschreibung beachtet wird. So blockiert der Filter*/BannerAd.gif$match-case
die Adressehttp://example.com/BannerAd.gif
, aber nichthttp://example.com/bannerad.gif
.
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).