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:

spam

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
...