eet zoals een bezoeker, niet zoals een scanner
Trackers die pas na scrollen of wachten vuren, ontsnappen aan een snelle controle. Wie wil weten wat een site echt doet, moet zich gedragen als een gewone bezoeker: scrollen, wachten, en per toestemmingskeuze apart meten. De scanner die alleen de eerste seconde ziet, ziet te weinig.
Waarom de scanner te weinig ziet¶
Veel volgtechniek vuurt niet meteen. Ze wacht op scrollen, op tijd, of op een handeling. Een statische of handmatige controle die alleen de eerste seconde bekijkt, mist die trackers volledig en concludeert te vroeg dat het meevalt. Dat is de zwakke plek van bijna elke snelle scan. Hij opent de pagina, leest wat er in het eerste moment gebeurt, en stopt. De techniek die op gedrag reageert, krijgt nooit de kans om af te gaan.
Een automatische scanner heeft daar nog een tweede zwakte bij. Hij gedraagt zich herkenbaar als een robot. Geen muisbeweging, geen scroll, een leeg toestel zonder geschiedenis. Sommige diensten reageren daar anders op dan op een mens. Het beeld dat een kale scanner oplevert, kan daardoor twee kanten op vertekenen: hij ziet de wachtende trackers niet, en de dienst behandelt hem soms als een uitzondering. Zie Niet alles vuurt bij opstart, sommige trackers wachten op jou.
Gedraag je als een bezoeker¶
Wie wil weten wat een site echt doet, moet zich gedragen als een gewone bezoeker. Scrollen, wachten, doorklikken. Pas dan komt de techniek in beweging die op gedrag wacht. De opname moet lang genoeg lopen om dat mee te krijgen.
Dat betekent niet dat ik willekeurig ga klikken. Ik doe wat een normale gebruiker doet in een normale volgorde. De pagina laten laden, even lezen, naar beneden scrollen, een keuze maken, doorklikken naar een tweede pagina, eventueel inloggen. Elke handeling is een trigger die iets kan losmaken. De kunst is om een realistische sessie na te bootsen die de trage triggers raakt zonder gedrag te verzinnen dat de dienst niet zelf uitlokt.
Er is een fijne balans te bewaken. Ik wil genoeg doen om de wachtende techniek te wekken, en ik wil binnen wat een echte bezoeker zou doen blijven. Twintig keer doelloos heen en weer scrollen valt daarbuiten en zou het beeld opblazen. Rustig doorlezen tot onderaan de pagina en dan doorklikken valt erbinnen. Als ik twijfel of een handeling nog realistisch is, kies ik de kant van de gewone gebruiker. Zo blijft de meting een afspiegeling van normaal gebruik en houdt de bevinding stand als iemand hem naloopt.
Per toestemmingsmodus apart¶
Het gedrag verschilt per toestemmingskeuze. Een site die alles laadt na "accepteren", houdt zich vaak in na "weigeren", en doet iets derde als je niets aanklikt. Daarom leg ik het verkeer drie keer vast:
- Zonder iets aan te klikken. De banner staat er, ik doe niets, ik gebruik de site zoals veel mensen doen die de melding wegnegeren.
- Na alles weigeren. Ik druk expliciet op weigeren en meet wat er daarna nog gebeurt. Zie Cookies weigeren scheelt echt, maar reken er niet blind op.
- Na alles accepteren. Ik geef volledige toestemming en zie het maximale beeld.
Het verschil tussen die drie is waar de bevinding zit. Eén meting over alles heen wist juist het interessante uit. Als een tracker alleen in de accepteer-opname zit, hoort hij bij consent. Zit hij ook in de weiger-opname, dan is dat een sterker signaal, want dan vuurt hij ondanks een geweigerde toestemming.
De drie opnames in de praktijk¶
Ik werk elke modus op dezelfde manier af, zodat de drie opnames vergelijkbaar zijn. Alleen de toestemmingskeuze verschilt, de rest van de sessie houd ik gelijk.
1. Verse staat. Ik begin met een schoon profiel of gewiste opslag, zodat oude cookies de meting niet kleuren.
2. Start de opname.
3. Open de site of app.
4. Maak de toestemmingskeuze die bij deze modus hoort, of laat hem bewust achterwege.
5. Voer dezelfde vaste route uit: laden, wachten, scrollen, doorklikken, inloggen.
6. Sla de opname op onder een naam die de modus vastlegt: zonder.har, weiger.har, accepteer.har.
Doordat alleen de toestemmingskeuze verschilt en de handelingen gelijk blijven, mag ik het verschil in verkeer toeschrijven aan de toestemming. Deze scheiding is de reden dat ik überhaupt iets kan zeggen over de rol van consent.
Het verschil tussen de modi berekenen¶
Met drie opnames wordt de vergelijking mechanisch. Ik haal per opname de set unieke hosts eruit en zet ze naast elkaar. De verzamelingen-logica doet de rest.
import json
def hosts_uit_har(pad):
with open(pad, encoding="utf-8") as f:
entries = json.load(f)["log"]["entries"]
return {e["request"]["url"].split("/")[2].lower() for e in entries}
zonder = hosts_uit_har("zonder.har")
weiger = hosts_uit_har("weiger.har")
accepteer = hosts_uit_har("accepteer.har")
print("Vuurt ondanks weigeren:", sorted(weiger))
print("Komt er alleen bij accepteren:", sorted(accepteer - weiger))
print("Al actief zonder enige keuze:", sorted(zonder))
print("Overal aanwezig (verdient aandacht):",
sorted(zonder & weiger & accepteer))De regel accepteer - weiger laat de hosts zien die pas na toestemming verschijnen. Dat is het te verwachten gedrag. De regel weiger en de doorsnede van alle drie zijn interessanter, want daar staan de partijen die contact maken ondanks een geweigerde of ontbrekende toestemming. Een host in die lijst is een aanwijzing, geen eindoordeel. Een naam of host bewijst nog geen tracking. De duiding volgt met Een naam in de code is nog geen tracker en Label elke bevinding op bewijsniveau.
Een kanttekening bij deze vergelijking is dat ze op hostnaam werkt en dat een enkele host meerdere rollen kan spelen. Een domein kan zowel een noodzakelijke functie leveren als een tracker bedienen. Daarom is de set-vergelijking de eerste zeef en geen eindstation. Voor elke host die na weigeren blijft opduiken, kijk ik naar de inhoud van de requests: welke identifiers gaan mee, welke payload, welk pad. Pas dan weet ik of het om functioneel verkeer gaat of om volgtechniek die zich weinig van de weigering aantrekt. De verzamelingen-logica wijst me de plek, het handwerk erna levert het oordeel.
Bewijsniveau: het verschil is het bewijs¶
De sterkste bevindingen uit deze aanpak zijn gemeten en ze ontlenen hun kracht aan het contrast tussen de drie opnames. Dat een tracker in de accepteer-opname zit, is een zwakke observatie op zichzelf, want toestemming verklaart hem. Dat dezelfde tracker ook in de weiger-opname zit, is een sterke observatie, want daar is de toestemming er niet en vuurt hij toch. Het bewijs zit in het verschil.
Dit is ook waarom ik de moeite van drie aparte sessies neem in plaats van één brede opname. Eén opname over alle keuzes heen zou de tracker wel bevatten en zou de vraag onbeantwoord laten of hij van consent afhing. De scheiding maakt van een losse waarneming een toetsbare uitspraak, want ik kan precies aanwijzen in welke modus de host wel en niet verscheen.
Daarom bewaar ik de drie opnames altijd samen, met de handelingen en de reikwijdte erbij. Een enkele opname zonder zijn tegenhangers verliest de helft van zijn zeggingskracht. En een bevinding die ik niet kan terugleiden naar een concrete modus en een concrete handeling, zwak ik af tot wat de opnames wel dragen. De bezoeker-aanpak kost meer tijd dan een scan en ze levert het enige beeld op waar ik een oordeel op durf te bouwen.
Zie ook Niet alles vuurt bij opstart, sommige trackers wachten op jou, Een mislukte meting is geen schone app en Label elke bevinding op bewijsniveau.
- Eigen onderzoeksdossier: mijnoverheid us, 2026-06-22headed massascan met stealth, HAR en diepe bestandsinspectie per site