Potrebbe capitare anche a voi, analizzando i dati di Google Analytics, di trovare traffico strano, sospetto. Un mare di visite con una frequenza di rimbalzo del 100% e strani referral a voi sconosciuti.
Molto probabilmente si tratta di Spam Referral, una tecnica black seo utilizzata da alcuni siti per cercare di ingannare i motori di ricerca. Una più precisa descrizione può essere trovata nel seguente articolo di Wikipedia.
La tipica situazione che potreste trovare sulle vostre console di Google Analytics è la seguente:
Il fenomeno può essere molto fastidioso, nascondendo i dati interessanti tra mille false visite
Vengono suggerite varie soluzioni al problema, da plugin per WordPress al filtraggio diretto dei dati in Google Analytics, l’approccio scelto da noi è un pò più tecnico e direttamente legato ad Apache.
L’idea è di utilizzare il mod_rewrite per identificare le chiamate che riportano un referrer noto come spammer e bloccarle con un 403 – Forbidden.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?.*thespammer2\.org.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?.*thespammer1\.net.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?.*thespammer\.com.*$ [NC]
RewriteRule ^(.*)$ – [F,L]
</IfModule>
Per avere una lista sempre aggiornata degli spammer verrà utilizzato un repository pubblico mantenuto su GitHub piwik/referrer-spam-blacklist. Di seguito un piccolo template ed uno script in Python per generare un file di configurazione di apache.
Template per creazione .conf di Apache
Questo è un template minimale, utilizzabile per essere incluso, in alternativa si possono preparare i template dei propri virtual hosts.
<IfModule mod_rewrite.c> RewriteEngine On $spammerList RewriteRule ^(.*)$$ – [F,L] </IfModule>
Script
Lo script riempie il template con i dati scaricati dal repository. E’ scritto in python e si può facilmente schedulare.
#!/usr/bin/python from string import Template import urllib SPAMMER_SOURCE = “https://raw.githubusercontent.com/piwik/referrer-spam-blacklist/master/spammers.txt“ template = Template(open(‘template’, ‘r’).read()) spammers = urllib.urlopen(SPAMMER_SOURCE).read().splitlines() RULE = “RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?.*$domain.*$$ [NC,OR]“ RULE_TEMPLATE = Template(RULE) LASTRULE = “RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?.*$domain.*$$ [NC]“ LASTRULE_TEMPLATE = Template(LASTRULE) formattedLines = [] for (i, line) in enumerate(spammers): line = line.replace(‘.’, ‘\.’) if i == len(spammers) - 1: formattedLines.append(LASTRULE_TEMPLATE.substitute(domain = line)) else : formattedLines.append(RULE_TEMPLATE.substitute(domain = line)) output = template.substitute(spammerList = “\n“.join(formattedLines)) print output
Per verificare il corretto funzionamento della configurazione, qualunque metodologia di protezione abbiate scelto, potete utilizzare wget
Esempio di chiamata bloccata
Si simula una chiamata http che abbia come referrer un sito presente nella lista degli spammer, la risposta deve essere 403 Forbidden.
wget \ --server-response \ --spider \ --referer='http://thespammer.com/' \ https://www.opengate.biz ... HTTP request sent, awaiting response... HTTP/1.1 403 Forbidden ...
Esempio di chiamata riuscita
Si simula una chiamata http che abbia come referer un sito legittimo: la risposta del server deve essere 200 OK.
wget \ --server-response \ --spider \ --referer='http://legitsite.com/' \ https://www.opengate.biz ... HTTP request sent, awaiting response... HTTP/1.1 200 OK ...