Besøkstellere: roboter som kjører JavaScript
Om morgenen 4. november 2026 viste besøkstelleren på VosPosts imponerende tall: 3 352 «menneskelige» besøkende på én dag og ytterligere 2 272 før klokken ett om natten, på et nettsted som vanligvis har rundt 400 besøk daglig. Ingen artikler var delt, og ingen lenker hadde gått viralt. Det var rett og slett roboter som telleren vår tok for lesere.
Her forteller vi hvordan vi oppdaget det, hvorfor regelen «kjøres JavaScript, må det være et menneske» ikke lenger holder, og hvordan du finner falske besøk i serverloggene dine.
Fellen: «JavaScript ble kjørt, altså er det et menneske»
Mange egenutviklede tellere, også vår, bygger på en enkel idé: Serveren registrerer siden som åpnes, og deretter sender et lite nettleserskript en ny forespørsel som «bekrefter» besøket. Tidligere lastet roboter bare ned HTML uten å kjøre kode. Den andre forespørselen kom aldri, og robotene ble ikke telt.
Nå er dette filteret fullt av hull. Mange roboter kjører i dag JavaScript akkurat som vanlige nettlesere:
- Søkemotorer gjengir sider for å forstå dem: Googlebot bruker oppdatert Chromium, og vi ser også Baiduspider-render, Applebot, Bytespider (ByteDance) og meta-webindexer.
- AdSense sin annonserobot (Mediapartners-Google) besøker sider for å analysere innholdet.
- Moderne scrapere styrer ekte nettlesere uten grafisk grensesnitt: headless Chrome, Puppeteer, Playwright eller lettere motorer som Lightpanda, utviklet for automatisering og KI-agenter.
For en teller som bare sjekker skriptkjøring, ser alle disse ut som lesere. Det mest oppsiktsvekkende er at problemet fantes før angrepet: På en helt vanlig dag, 3. november, kom 446 av de 621 besøkene registrert som menneskelige faktisk fra roboter. Mer enn sju av ti.
Tegn på en scraper med hodeløs nettleser
Toppen 4. november hadde alle kjennetegn på organisert scraping. Ingen av tegnene beviser noe alene, men samlet levner de liten tvil.
En ny IP-adresse for hver side
Hver side ble hentet fra en forskjellig IP-adresse, spredt over hele verden. Dette kjennetegner boligproxyer: nettverk som sender forespørsler via private internettforbindelser, ofte uten eiernes viten. Å blokkere IP-adresser hjelper lite: Det finnes tusenvis, og de tilhører virkelige husstander.
Nettlesere som har vært utdaterte i årevis
User-agentene gikk i ring mellom noen få varianter: Chrome 118–120, Firefox 120 og 121 samt Edge 119 og 120. Disse er fra slutten av 2023. Chrome og Firefox oppdateres imidlertid automatisk omtrent hver fjerde uke; ekte lesere brukte Chrome 148–156. Én person med en tre år gammel nettleser er mulig, men tusenvis på én natt tyder på en fast liste kopiert inn i et scraping-verktøy.
Midt i denne rotasjonen dukket også Lightpanda/1.0 opp helt uten forkledning.
Altfor regelmessig atferd
- Bare stasjonære datamaskiner, ingen mobiler, selv om mesteparten av ekte trafikk kommer fra telefoner;
- ingen henvisere: Ingen kom fra Google, sosiale medier eller andre nettsteder;
- 2 340 forskjellige søk i nettstedets interne søkefunksjon for å hente flest mulig sider;
- 24 772 forespørsler på ett døgn, tilsvarende 42 % av all servertrafikk.
Den skjulte risikoen: annonser
En hodeløs nettleser kjører alt, også innlasting av annonseplasser. Den dagen lastet roboten annonseblokkene våre 2 939 ganger. For AdSense-utgivere er dette alvorlig: Robotgenererte visninger regnes som ugyldig trafikk, som Google trekker fra inntektene og som ved gjentakelse kan sette kontoen i fare. Oppblåste besøkstall handler altså ikke bare om stolthet.
Slik finner du robotene i loggene
Tilgangslogger fra Apache eller Nginx i «combined»-format inneholder alt du trenger. Noen få kommandoer gjør jobben. Først de vanligste user-agentene:
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -30Se deretter på fordelingen av Chrome-versjoner. På vanlige nettsteder samler trafikken seg rundt de fire–fem nyeste versjonene; en stor gruppe gamle versjoner er lett å oppdage:
grep -oE 'Chrome/[0-9]+' access.log | sort | uniq -c | sort -t/ -k2 -nAntall forespørsler per time viser nøyaktig når en bølge begynner og slutter:
awk '{print substr($4, 2, 14)}' access.log | sort | uniq -cFor en mistenkelig signatur kan du til slutt sammenligne antall forespørsler med antall unike IP-adresser. Er tallene nesten like, har du funnet proxynettverket:
grep -c 'Chrome/119.0.0.0' access.log
grep 'Chrome/119.0.0.0' access.log | awk '{print $1}' | sort -u | wc -lEn nyttig detalj: Siden 2022 sender Chrome bare hovedversjonsnummeret etterfulgt av .0.0.0. Formatet Chrome/119.0.0.0 er derfor normalt; det er tallet 119 som avslører roboten.
Tiltakene vi innførte
Slutte å telle uten å blokkere
Første nivå: Telleren avgjør på serversiden om besøket skal telles. Et besøk regnes ikke lenger som menneskelig hvis user-agenten er tom, oppgir at den er en robot (bot, spider, crawler, HTTP-verktøy som curl eller Python, hodeløse nettlesere), eller angir Chrome eller Firefox som er over to og et halvt år gammel. Grensen beregnes automatisk ut fra datoen:
$jours = (time() - mktime(0, 0, 0, 12, 5, 2023)) / 86400; // Chrome 120, décembre 2023
$version_actuelle = 120 + (int)floor($jours / 28); // une version toutes les 4 semaines
if (preg_match('/Chrome/(d+)./', $ua, $m) && (int)$m[1] < $version_actuelle - 32) {
return true; // navigateur trop ancien pour être un lecteur réel
}Et viktig sikkerhetstiltak: Innloggede brukere telles alltid, uansett nettleser. Filteret retter seg mot ukjente besøkende, ikke trofaste medlemmer som har glemt å oppdatere en gammel maskin.
Avvise scrapere, slippe gjennom søkemotorer
Andre nivå er mer offensivt: Serveren svarer nå med 403 på scraper-signaturer, men gjør et uttrykkelig unntak for legitime søkemotorroboter. I Apache trengs bare noen linjer:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (Lightpanda|HeadlessChrome) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Chrome/1(18|19|20).0.0.0 [OR]
RewriteCond %{HTTP_USER_AGENT} Firefox/12[01].
RewriteCond %{HTTP_USER_AGENT} !(bot|spider|crawl|google|bing|facebook) [NC]
RewriteRule ^ - [F]De tre første vilkårene er koblet med [OR], mens det siste legges til med et underforstått «og»: En signatur blokkeres med mindre user-agenten hevder å være en søkemotor eller et sosialt nettverk. Etterpå testet vi begge sider: Scraperen får 403, mens nyere Chrome, iPhone, Googlebot, Bingbot og AdSense-roboten fortsatt får sidene.
Å blokkere Googlebot ved en feil kan koste langt mer enn oppblåste besøkstall. Test hver regel med søkemotorenes user-agenter før du setter den i produksjon.
Begrensninger du bør kjenne til
En user-agent kan forfalskes med én linje. Når denne scraperen utgir seg for å være Chrome 155, vil reglene ikke lenger fange den opp. Dette er ikke varig beskyttelse, men grunnleggende vedlikehold: Det fjerner de lite avanserte robotene, som er flest, og gjør tallene forståelige igjen. Skal du videre, må du kombinere signaler (ingen henviser, én side per IP, ingen musebevegelser eller rulling) eller bruke en spesialisert tjeneste for robotdeteksjon.
Den egentlige lærdommen er en annen: En teller som lyver én gang i året under en dramatisk topp, lyver sannsynligvis også mer diskret alle andre dager. Har du aldri sett på tilgangsloggene, bruk ti minutter på å kjøre kommandoene over på en helt vanlig dag. Resultatet kan overraske deg.
Norwegian
French
German
English
Spanish
Hindi
Italian
Japanese
Korean
Chinese


