FAQ - Onder de motorkap van Adblock Plus

Waar zijn alle Adblock Plus voorkeuren beschreven?

Adblock Plus gebruikt een aantal voorkeuren die u via about:config kunt benaderen. Ze beginnen allemaal met extensions.adblockplus. (dit wijkt af van Adblock en Ablock Plus 0.5 wat het voorvoegsel adblock. gebruikt). Een volledige lijst met uitleg kunt u hier vinden.

Hoe benader ik Adblock Plus vanuit mijn extensie?

Om het mogelijk te maken voor andere extensies om met de Adblock Plus interface samen te werken, wordt IAdblockPlus geëxporteerd. Bekijk de interface beschrijving voor nadere details.

Hoe blokkeert Adblock Plus adressen?

Het moeilijke werk wordt hier eigenlijk door Gecko gedaan, de motor waar bovenop Firefox, Thunderbird en andere applicaties gebouwd zijn. Het staat iets toe genaamd "inhoudsbeleiden". Een inhoudsbeleid is simpelweg een JavaScript (of C++) object dat elke keer aangeroepen wordt als de browser iets moet doen. Het kan het adres dat geladen moet worden bekijken en nog wat extra gegevens en beslissen of het moet worden toegestaan of niet. Er is een aantal ingebouwde inhoudsbeleiden (als je definieert welke sites geen afbeeldingen mogen laden in Firefox of SeaMonkey, configureer je eigenlijk een van deze interne inhoudsbeleiden) en iedere extensie kan er een registreren. Dus get enige wat Adblock Plus hoeft te doen is zijn inhoudsbeleid registreren, behalve dat is er alleen de applicatielogica om te beslissen welke adressen geblokkeerd moeten worden en de code voor de gebruikersinterface om het instellen van filters mogelijk te maken.

Voor ontwikkelaars: om een inhoudsbeleid te registreren moet u XPCOM component schrijven die de nsIContentPolicy interface implementeert.Let er op dat je de module's registerSelf methode aanpast om je component in de "inhoudsbeleid" categorie te registreren (gebruik hier de category manager voor). Dat is alles, uw component's shoudLoad methode wordt aangeroepen en u kunt beslissen of dit specifieke verzoek gehonoreerd moet worden of niet.

Hoe verwerkt Adblock Plus zijn filters en welke filters zijn sneller?

Alle filters worden intern in reguliere expressies vertaald, zelfs degenen die niet zo zijn opgegeven. Bijvoorbeeld het filter ad*banner.gif| wordt vertaald in de reguliere expressie /ad.*banner\.gif$/. Als Adblock Plus echter een adres krijgt dat met alle filters vergeleken moet worden, dan test het niet simpelweg alle filters een voor een — dat zou het browsen onnodig vertragen.

Naast het vertalen van filters in reguliere expressies probeert Adblock Plus er ook informatie uit te halen. Het heeft een unieke string van acht karakters nodig (een "snelkoppeling") die in elk adres wat met het filter overeenkomt aanwezig moet zijn (de lengte is arbitrair, acht leek hier gewoon redelijk te zijn). Als u bijvoorbeeld een filter |http://ad.* heeft, dan heeft Adblock Plus de keuze tussen "http://a", "ttp://ad" en "tp://ad.", al deze strings zullen altijd aanwezig zijn, wat er maar overeen mag komen met dit filter. Helaas is het vinden van een snelkoppeling voor filters die minder dan acht karakters ononderbroken door wildcards hebben of voor filters die als reguliere expressies zijn opgegeven onmogelijk.

Alle snelkoppelingen worden in een opzoektabel geplaatst, Adblock Plus kan het filter erg efficiënt vinden aan de hand van zjin snelkoppeling. Dan, als een specifiek adres getest moet worden, zal Adblock Plus eerst bij bekende snelkoppelingen kijken (dit gebeurt erg snel, de tijd die hiervoor nodig is is haast onafhankelijk van het aantal snelkoppelingen). Alleen als er een snelkoppeling wordt gevonden wordt de string vergeleken met de reguliere expressie van het overeenkomende filter. Alleen filters zonder snelkoppeling moeten een voor een getest worden, wat langzaam is.

Samengevat: welke filters moet u gebruiken om een filterlijst snel te maken? U moet zo min mogelijk reguliere expressies als mogelijk gebruiken, deze zijn altijd langzaam. U moet er ook voor zorgen dat de eenvoudige filters op zijn minst acht karakters onafgebroken tekst hebben (dit betekent dat ze geen karakters met een bijzondere betekenins moeten bevatten, zoals *), anders zullen ze net zo langzaam zijn als reguliere expressies. Maar met filters die aan de eisen voldoen maakt het niet uit hoeveel filters je hebt, de verwerkignstijd is altijd gelijk. Dat betekent dat als je 20 eenvoudige filters nodig hebt om een reguliere expressie te vervangen het nog steeds de moeite waard is. Nu we het er toch over hebben — de deregifier is van harte aan te bevelen.

Het filtermatchingalgoritme in detail

Hoe werkt het verbergen van elementen?

Element verbergende regels worden vertaald in CSS en toegepast op alle webpagina's die de gebruiker bezoekt. Een regel als example.com#div(evil_ad) ziet er dan zo uit:

@-moz-document domain(example.com)
{
  div#evil_ad, div.evil_ad
  {
    display: none !important;
  }
}

@-moz-document is een voorgestelde uitbreiding op de CSS standaard, u kunt hier meer over lezen in het Mozilla Developer Center.

Regels die niet beperkt zijn to een bepaald domein zullen worden beperkt door de protocollen http:// en https:// om te voorkomen dat ze elementen van de browser's interface verbergen (het gebruikt het chrome:// protocol schema). Bijvoorbeeld de regel #div(evil_ad) wordt vertaald in:

@-moz-document url-prefix(http://),url-prefix(https://)
{
  div#evil_ad, div.evil_ad
  {
    display: none !important;
  }
}

Voor ontwikkelaars: Adblock Plus gebruikt hier de stylesheet service. Deze interface is nieuw voor Gecko 1.8 en staat extensies toe om user stylesheets dynamisch toe te voegen (daarvoor kon je alleen userContent.css wijzigen, wat een herstart van de browser vereiste). User stylesheets zullen CSS code van alle websites overschrijven, zij heben het hoogste belang.

Hoe vaak worden abonnementen gedownload?

De standaard waarde is om het abonnement dagelijks te downloaden. Auteurs van abonnementen kunnen deze waarde echter aanpassen, bijvoorbeeld om onnodig verspillen van verkeer tegen te gaan. Alles tussen een uur en elke 21 dagen is mogelijk. Een manier om dit aan te passen is om de HTTP Expires kopregel in te stellen. De Apache mod_expires module maakt dit mogelijk voor u, je schrijft gewoon het volgende in het .htaccess bestand:

ExpiresActive on
ExpiresByType text/plain "access plus 5 days"

Dit zorgt ervoor dat de filterlijst 5 dagen nadat het gedownload is verloopt. Als je je filterlijst met een Perl script maakt, kan je hetzelfde bereiken met het commando:

$cgi->header(-expires => "+5d");

Dit werkt op een vergelijkbare manier voor andere talen, zoals PHP. Als je om een bepaalde reden de HTTP kopregels niet kan aanpassen, voeg dan een commentaar aan je filterlijst toe. Bijvoorbeeld zo:

[Adblock]
! This list expires after 5 days

Het maakt niet uit waar dit commentaar staat. Adblock Plus kijkt naar alle commentaren met het trefwoord "expires after" of "expires:" gevolgd door een getal. Standaard wordt het nummer geïnterpreteerd als het aantal dagen. Een nummer gevolgd door de letter "h" wordt echter geïnterpreteerd als het aantal uren, bijvoorbeeld "Expires: 3h" of "expires after 3 hours" zegt tegen Adblock Plus om de lijst na 3 uur opnieuw te downloaden.

Let op dat dit alleen de minimale tijd tussen downloads is. Als de gebruiker geen browser open heeft, wordt de lijst alleen gedownload als hij hem weer start.

Mijn abonnementen zijn verplaatst, hoe zorg ik er voor dat iedereen het adres bijwerkt?

Vanaf Adblock Plus 0.7.5 zijn permanente redirects volledig ondersteund. Dit betekent dat niet alleen het abonnement gedownload wordt van zijn nieuwe locatie, maar dat ook het adres van het abonnement in Adblock Plus wijzigt, zo dat downloads vervolgens meteen het nieuwe adres zullen gebruiken. Hoe kan je van deze functie gebruik maken?

Eerste mogelijkheid: redirect met HTTP kopregels. Het verzoek voor het oude lijst adres zou moeten resulteren in een "301 Moved Permanently" antwoord. Adblock Plus volgt de redirect en past het adres van het abonnement aan als dit lukt. U kunt zo'n redirect nijvoorbeeld maken met Apache's mod_alias module, voeg iets toe in de trant van de volgende regel aan uw .htaccess bestand:

Redirect permanent /old_list.txt http://example.com/new_list.txt

Als u geen HTTP rediect kunt maken bij uw host, kunt u nog steeds een speciaal commentaar gebruiken om het nieuwe adres van uw abonnement aan te geven. Dit moet er als volgt uit zien:

[Adblock]
! Redirect: http://example.com/new_list.txt

Dit commentaar kan overal in uw filterlijst voorkomen, Adblock Plus scant alle commentaren af voor het trefwoord "redirect:" en "redirect to" gevolgd door een adres. Als zo'n commentaar gevonden is, wordt een nieuw abonnement update in na een uur in gang gezet met het nieuwe adres. Als deze update lukt, wordt het adres van het abonnement aangepast.

Tenslotte kan het gebeuren dat uw server niet beschikbaar is en gebruikers elk uur een download fout krijgen, elke keer als een abonnement bijgewerkt moet worden. Zelfs als u dit probleem niet kunt voorkomen, is er toch een oplossing. Na een aantal mislukte pogingen (bepaald door de extensions.adblockplus.subscriptions_fallbackerrors voorkeur), neemt Adbock Plus contact op met het adres dat opgegeven is in de extensions.adblockplus.subscriptions_fallbackurl voorkeur voor verder instructies. Als het probleem bekend is, geeft dit adres de nieuwe locatie van uw filterlijst. Dus als u op de normale manier geen locatie verandering voor uw abonnement kunt opgeven, stuur dan alstublieft een e-mail.

Hoe ziet de eerste regel van een filter bestand er uit?

Normaal gesproken is de eerste regel van een filter bestand simpelweg [Adblock]. Misschien heb je echter gezien dat er in recente versies van Adblock Plus soms een andere tekst staat. Dit wordt gedaan als je filters in de lijst hebt die een geavanceerde filtersyntax hebben die alleen door nieuwere versies van Adblock Plus ondersteund worden en niet in de originele Adblock. Een voorbeeld zou kunnen zijn:

(Adblock Plus 0.6.1.2 or higher required) [Adblock]

Dit is gewoon een commentaar. Adblock (en Adblock Plus ook om dezelfde reden) negeert alles voor het echte merkteken. De vereiste Adblock Plus versie wordt niet opgelegd, omdat Adblock Plus 0.6.1.2 het nog niet nidersteunt. Als je echter een nog nieuwere syntax gebruikt, krijg je zoiets als:

[Adblock Plus 0.7.1]

Dit soort kopregel wordt ondersteund vanaf Adblock Plus 0.7.1. Oudere versies van Adblock Plus en Adblock kunnen bestanden die met deze kopregel beginnen niet openen. Wat de huidige versies betreft, deze zullen het versienummer in de koprgel vergelijken met hun eigen versie nummer. Als het bestand een nieuwere versie van Adblokck Plus nodig heeft, krijgt de gebruiker bij het importeren een boodschap met de vraag om te upgraden. Abonnementen zullen nog steeds bestanden bedoeld voor nieuwere versies van Adblock Plus laden maar laten een waarschuwinf in het voorkeurvenster zien.

Ten slote, als je Adblock Plus wilt eisen maar geen versienummer wilt opgeven, kan je het bestand laten beginnen met[Adblock Plus]. Dit bestand wordt natuurlijk alleen geaccepteerd door Adblokc Plus 0.7.1 of hoger.

Hoe bescherm ik mijn filters tegen toevallige download corruptie?

Proxy servers en antivirus en firewall software kunnen downloadfs aanpassen. Soms verandert een filter "*/voorbeeld/*" daardoor in "**" wat tot gevolg heeft dat alles geblokkeerd wordt. Om dit te voorkomen kunnen beheerders van een abonnement een controlegetal aan het begin van hun filterlijst toevoegen, zoals dit:

[Adblock]
! Checksum: OaopkIiiAl77sSHk/VAWDA
test

Adblock Plus negeert de download als het controlegetal niet overeenkomt met de inhoud van het bestand. Als je filters exporteert in Adblock Plus wordt er automatisch een controlegetal gegenereerd. Het wordt als volgt berekend:

  • Neem de UTF-8 gecodeerde tekst van de filterlijst (inclusief de eerste regel)
  • Converteer alle regeleinden naar UNIX stijl (verwijder \r karakters als deze aanwezig zijn)
  • Verwijder lege regels (vervang opeenvolgende voorkomens van \n karakters door een enkel \n karakter)
  • Verwijder een bestaand controlegetal commentaar
  • Bereken een base64-geëncodeerd MD5 controlegetal van de tekst, terwijl je alle = karakters verwijdert als die voorkomen

De Perl code om dit te bereiken ziet er zo uit (aangenomen dat de codering van het bestand UTF-8 is):

use Digest::MD5 qw(md5_base64);

my $data = readFile($file);

# Normalize data
$data =~ s/\r//g;
$data =~ s/\n+/\n/g;

# Remove existing checksum
$data =~ s/^\s*!\s*checksum[\s\-:]+[\w\+\/=]+.*\n//mi;

# Calculate new checksum
my $checksum = md5_base64($data);

Vergelijkbare implementaties bestaan om een controlegetal te valideren en om een controlegetal aan een betand toe te voegen.

PHP code voor het berekenen van een controlegetal (wederom aangenomen dat het bestand in UTF-8 gecodeerd is):

$data = file_get_contents($file);

# Normalize data
$data = preg_replace('/\r/', '', $data);
$data = preg_replace('/\n+/', "\n", $data);

# Remove existing checksum
$data = preg_replace('/^\s*!\s*checksum[\s\-:]+([\w\+\/=]+).*\n/mi', '', $data);

# Calculate new checksum
$checksum = base64_encode(pack('H*', md5($data)));
$checksum = preg_replace('/=+$/', '', $checksum);
Powered by AnwikiOver Adblock PlusPrivacy PolicyImpressum