
Inizia oggi una nuova miniserie del buon Camu, impegnato in una lotta contro lo spam.
Qualche settimana fa ho subito un’ondata massiccia di spam sul mio blog, come mai m’era capitato.
Intendiamoci, il mio blog si colloca nella parte bassa della coda lunga, non ho milioni di visitatori al giorno, e quindi anche gli spammer in genere mi lasciano in pace. Ma un giorno ho notato una lentezza sospetta nel caricare le pagine, ed in effetti ho scoperto, grazie al plug-in Akismet che uso sul mio sito per tenere a bada i cattivi, che in una settimana avevo ricevuto qualcosa come 12.000 commenti (o meglio tentativi di commenti) che il buon guardiano Akismet aveva prontamente bloccato.
In effetti neppure uno di questi messaggi fastidiosi era riuscito a farla franca, il che mi ha confermato la bontà di questo plug-in. Ma il problema era un altro: il picco eccessivo di visite in un breve lasso di tempo, ha fatto scattare i “vigili urbani” di Tophost, il provider che mi ospita. Per evitare proprio questo genere di attacchi, i loro sistemisti hanno infatti messo in piedi un sistema di QoS (Quality of Service).
Per farla semplice funziona così: ogni tot secondi hai un massimo numero di richieste effettuabili al database su cui si poggia il sito, sforato quel numero viene restituito un errore. Insomma, long story short direbbero gli americani: Akismet era stato efficace, ma non aveva eliminato il problema alla radice.
Pur filtrando egregiamente i messaggi spazzatura, il suo lavoro aveva consumato risorse di sistema, attivando buona parte degli ingranaggi di WordPress che si mettono in moto quando viene postato un nuovo commento. Volevo qualcosa di più efficace, e così mi sono messo a pensare ad una soluzione.
Ecco l’idea: bloccare gli indirizzi IP da cui provengono le richieste di spam a livello di server web, ancora prima che l’interprete PHP venga invocato. In altre parole, anziché far entrare il brutto ceffo e poi farlo sbattere fuori da Akismet dopo che questo ha sgranocchiato un po’ di risorse del sistema, bisogna proprio chiudergli la porta in faccia. In fondo il server web chiede sempre a tutti i visitatori (in maniera trasparente) un po’ di informazioni su chi sono e da dove vengono.
Il sistema funziona dunque così:
- C’è una lista nera, dove si tiene traccia degli indirizzi IP sospetti.
- La prima volta che un malintenzionato lascia un commento di spam, Akismet lo pizzica e lo sbatte fuori.
- A questo punto, un suo assistente (il plug-in che scriveremo in questa miniserie), prende nota del suo indirizzo IP, scrivendolo in un file accessibile al server web (noto come
.htaccess). - Il server verrà quindi istruito (sempre tramite
.htaccess) in modo da non far entrare tutti quelli che sono in questa lista nera. Così la prossima volta che il brutto ceffo bussa alla porta del server web, questo non gli aprirà, senza neanche disturbare Akismet.
Oggi, per cominciare, vedremo uno dei tanti modi per dire al server web di bloccare l’accesso ad un determinato indirizzo IP. Nel seguito presupporremo che il tuo server sia Apache, sebbene altri prodotti abbiano funzionalità analoghe.
Il file .htaccess si trova in genere nella cartella principale del sito: un documento di testo contenente una serie di istruzioni (dette anche direttive), raggruppate in base al contesto in cui si applicano.
Se ad esempio voglio che il server faccia qualcosa ogni volta che qualcuno accede al file index.php, scriverò
# Qui metto le istruzioni
</Files>
La flessibilità di Apache consente anche di raggruppare anche cose più complesse, tipo “tutti i file che finiscono in .php”, ma eviterò di dilungarmi in tali dettagli, in questo contesto. Ti basti sapere che, giocando opportunamente con le espressioni regolari, puoi davvero creare ogni genere di filtri.
Un’altra cosa che possiamo fare è creare una variabile al verificarsi di una condizione. In pratica quello che voglio fare è: se l’indirizzo IP del visitatore è nella lista nera, me lo ricordo (impostando una variabile a 1) per poterlo bloccare:
# Il cancelletto all'inizio rappresenta un commento
Order Allow,Deny
Allow from all
Deny from env=bruttoceffo
</Files>
SetEnvIf Remote_Addr "^123\.123\.123\.123$" bruttoceffo=1
La sintassi è un po’ astrusa, ma comprensibile. La lista nera sarà dunque un elenco di questi SetEnvIf, che il nostro plug-in aggiungerà opportunamente al file .htaccess ogni volta che Akismet pizzicherà uno di questi furfanti.
Nella prossima puntata vederemo come creare il plugin che modifichi il file .htaccess in modo automatico.
La miniserie continua:
- Un aiuto ad Akismet: un plugin WordPress per bloccare gli IP
- WordPress: Dare agli spammer la possibilità di redimersi
Autore: Camu di DueChiacchiere
14 Commenti










ottimo post!
Beh, ora che lo rileggo mi sembra una storiella per bambini più che un post tecnico, spero che nessuno se l’abbia a male se ho voluto usare questo “stile” narrativo
Tipo il lupo cattivo che bussa alla porta del nostro server, poi soffia e lo butta giù?
Scherzi a parte, raccontato così è più divertente da leggere e meno pesante
Molto interessante questo articolo, aspetto con ansia le prossime puntate anche perchè qualche mese fa ho avuto anche io il tuo stesso problema sul mio blog che non ha un numero così elevato di visite da far pensare che interessi ai spammer ma evidentemente, evidentemente però non era così.
@Ghido, si anche io la penso come te sull’essere meno pesante e più divertente, ma qualcuno potrebbe non essere d’accordo
Ad ogni modo, è sempre un approccio che mette curiosità a chi ha voglia di scoprire nuovi trucchi…
E’ scritto in maniera ottimale per chi lavora online e vuole che il suo articolo sia “appiccicoso” e che il lettore lo legga fino alla fine…
Complimenti
Ottimo post
circa un mese fa ebbi nel giro di poche ore una ventina di commenti di spam che akismet non mi blocco. Quando li segnalai come spam il db del blog si danneggiò…..
Una giornata per rimettere tutto a posto
Che bell’idea! Veramente bella!!!
Leggerò sicuramente il prossimo articolo.
Provo a indovinare
… Per caso hai intezione di inserire un paio di righe in Akismet per far modificare il file .htaccess quando rileva lo spam?
Ci sei andato vicino. Quella soluzione sarebbe più spartana e poi dovresti rifare il lavoro ogni volta che aggiornano Akismet. Quella che vi proporrò io invece è più elegante e di certo adatta anche ai meno smanettoni.
Come gestisci i falsi positivi? Sono quelli che mi preoccupano maggiormente. Li trascuri in favore dei grossi numeri? Oppure c’è una lista temporanea di IP da verificare?
Ciao,
Emanuele
In effetti mi sono chiesto anch’io la stessa cosa ^^
@Emanuele: li verifico a mano rimouvendoli poi dalla lista nera. Come dirò nella seconda puntata della miniserie, il plugin è molto semplice e non include nessuna funzionalità avanzata di gestione, ma con un po’ di buona volontà quelle funzioni possono di certo essere aggiunte. Magari creando una lista “grigia”, in cui le righe sono commentate e possono essere attivate manualmente… D’altro canto, questo plugin nasce come prova concettuale di quello che si può fare
Dunque, un piccolo aggiornamento sul mio plugin. Pare che, come nella migliore tradizione in questi casi, sia stato applicato il famoso modo di dire “fatta la legge, trovato l’inganno”. In effetti il mio scudo protettivo ha (almeno) un tallone d’achille, che comunque richiede un minimo di sforzo per essere messo in pratica: il fatto che il cattivo di turno si presenti con le sue vere credenziali. Ho appena scoperto infatti che alcuni di questi usano mascherare il proprio indirizzo vero e presentarsi come provenienti da Google. Quello che succede è che Akismet li pizzica lo stesso, ma in lista nera ci finisce un indirizzo appartenente agli spider di Google, che quindi non sarà più in grado di indicizzare il sito, e vi butterà fuori dalla SERP. Io me ne sono accorto tramite Google Webmaster Tools, quando l’altro giorno ho visto una sfilza di 403 tra gli errori del crawler. Suggerimenti su come contrattaccare?
Non ho capito niente
forse sono sul post sbagliato! Ho appena installato Akismet ma non ho capito che altro devo fare, devo attivarlo? Ok già fatto. Ma poi devo fare altro?