Lo spam nei blog è diventato qualcosa di gigantesco. Io stesso ricevo una ventina di messaggio ogni 4/5 ore.
Proprio per questo, volendo evitare all’utente la noiosaggine dei numeretti da copiare prima di commentare, ho sviluppato un plugin per dblog che permette la moderazione preventiva e successiva dei commenti.
Se siete utenti dblog e preferite i classici numeretti, potete scaricare anche un plugin di Marlenek che implementa il chaptcha.
Entrambi i plugin sono disponibili gratuitamente nel laboratorio di dblog!
Ultimamente ho preferito non cancellare subito lo spam, e di monitorarlo per capire su cosa agire. Cosa avevano in comune tutti i messaggi spam che ricevo? Sicuramente testo molto simile, autori anch’essi simili… Ma un solo elemento mi permetteva di aggregare univocamente lo spam: il range dell’IP dello spammer!!!
Agire sull’IP non è mai cosa buona. La stragrande maggioranza degli utenti hanno un IP dinamico. Bannare un utente sul suo IP può voler dire limitarlo solo fino alla prossima riconnessione. E può voler dire bannare per il futuro tutti quelli che prenderanno l’IP del malfattore.
Se però il range di IP è molto al di fuori dei range soliti dei nostri visitatori, allora agire su questo è meno rischioso di quello che si può pensare.
I range di IP che spammano sul mio blog sono ucraini, russi, bielorussi… E non ho molti visitatori in quelle zone. Per cui bannare un provider del genere, nella maggior parte dei casi non provoca danni particolari
.
Vediamo come impedire l’accesso alle nostre pagine, prima in ASP poi in PHP.
1. Creare una pagina d’errore.
Con il vostro editor di testo preferito, create un file di nome 403.htm ed inviatelo nella root del vostro sito. Al suo interno andrete a scrivere:
You have no permission to access davidonzo.com
<br />
This ban has been provided cause you seems to be a malicious connection and/or a spammer
<hr />
<i>For any explication, please, email me to <b>davidonzo [at] gmail.com</b> <br />
I apologize for any inconvenient</i>
Ovviamente cambierete il nome del dominio e la mail
.
2. Dove posizionare il codice.
Prima di passare alla codificazione vera e propria, è importante sottolineare che il codice che controlla l’ip del client, ed agisce in caso di bad IP, va messo nel file che per primo si esegue durante la generazione di una pagina!
In parole povere, dovete inserire il codice nella parte alta del file di header della vostra applicazione web. Solo in questo modo sarete sicuri che non verrà eseguito codice proprio del sito, in caso di cattivo client connesso.
3. Facciamolo in ASP
Di seguito direttamente il codice:
‘popola la stringa con le prime due cifre di ogni IP di cui
‘vuoi bannare il range
stringa = "127.0,0.0"
q = Split( stringa,"," )
IP = Request.ServerVariables( "REMOTE_ADDR" )
s = Split( IP, "." )
FOR i=0 to UBound(s)-2
IP1 = s(0) & "." & s(1)
IF IP1 = q(i) Then
response.redirect ( "403.htm" )
END IF
NEXT
%>
Semplice no?! Ho la stringa che può contenere più range. Basta separarli da una virgola. Splitto la stringa per crearmi un array con i vari range.
Prendo l’IP del client e controllo che le sue prime due cifre sono dentro uno dei range che voglio bannare. In caso positivo lo invio alla pagine di accesso negato
.
Perchè il tutto funzioni a dovere, basterà popolare la stringa nel modo migliore!
4. Facciamolo in PHP
E’ praticamente la stessa cosa… o quasi:
//popola l’array con i range a cui vuoi negare l’accesso
$banned = array( "127.0","0.0" );
$ip = $_SERVER["REMOTE_ADDR"];
$range = split( $ip,"." );
$lok = $range[0] & "." & $range[1];
if (in_array($lok, $banned)){
header( "Location: 403.htm" );
//da la certezza che non venga eseguito il codice sottostante!
exit();
}
?>
Popolo l’array con i range che voglio bannare, prendo l’IP del client e faccio lo stesso controllo. Se il suo range è nell’array, lo invio a 403.htm per fargli capire che non è persona desiderata
.
NB: la funzione header( "Location: pagina.html" ) funzionerà a patto che non siano stati inviati altri header. Se il codice sopra riportato è stato correttamente inserito come primissima perte di codice eseguibile, allora il redirect avrà effetto, altrimenti si rischia di vedersi rispondere un errore di tipo "header already sents".
In questo caso la soluzione migliore è implementare una funzione di redirect che tenga conto di questa eventualità. E’ cosa semplice, se volete chiedetemi pure.
5. Cautele
Prima di bannare un range, controllate che non sia usato da altri utenti vostri abituali e rispettosi visitatori.
Mai bannerete un range italiano. Per avere specifiche di un IP basta inviare un whois a nic.com.
Esistono modi migliori per ottenere lo stesso risultato: se usate un server Apache, il file .htaccess è la soluzione ad ogni problema. Ciò non di meno, alcuni provider impongono serie limitazioni alle possibilità di configurazione del .htaccess.
Se non ti piacciono i captcha, avevo letto un’articolo che proponeva un’alternativa carina: Veniva presentata una griglia (3×3 o 4×4) con delle immagini di cani, gatti, gommoni, … tutti mischiati. Per superare la prova dovevi clickare solo i gatti o solo i cani o solo i gommoni.
@ Giambo: drogato
Noi di Wp siamo fortunati Akismet funziona alla grande
@davidonzo: Io la trovo una buona alternativa ai captcha
!
?
@Barbara: Interessante ! Pero’ diffido sempre dei tools automatici … Se per sbaglio mi pialla un commento importantissimo
Ovviamente hai modo di controllarli ma ti dirò io lo uso da sempre e finora non ha mai cannato (facendo i debiti scongiuri)