Anti-spam : comment se débarasser des spams de referer
Ils s'amusent à polluer les logs de nos serveurs pour se faire de la pub gratuite. Comme ils aiment manger notre bande passante, nous allons manger la leur.
Introduction
Le spam de referer est une technique de spam très fréquente dont vous avez surement été victimes, peut-être même sans le savoir, à partir du moment où vous administrez un serveur.
La méthode est simple : avec un script ou programme, les spammeurs envoient des requêtes à votre site, généralement pour demander l'affichage de la page sommaire, et votre serveur enregistre celles-ci dans les logs d'Apache comme il le fait pour chacune des connexions à votre site. Ces lignes enregistrées contiennent l'IP, la date et l'heure, la page demandée et surtout le referer, c'est à dire d'où viennent ces requêtes. Lorsque vous naviguez sur un site xxxx.com et que celui-ci contient un lien vers le site yyyy.com, si vous cliquez sur ce lien, votre navigateur indiquera à yyyy.com que vous venez de xxxx.com. C'est ce que l'on nomme le referer et que votre serveur Apache récupère via la variable HTTP_REFERER envoyée par votre navigateur.
Les spammeurs ont donc trouvé un grand intérêt là-dedans : beaucoup de sites rendent accessibles leurs statistiques à tous c'est à dire à vous, à moi, mais aussi et surtout à tous les moteurs de recherche. En se connectant à votre serveur et en envoyant un referer qui contient l'adresse de son site, le spammeur espère que si vos statisques sont accessibles, il se fera référencer par les moteurs de recherche. Et en faisant la même chose avec des milliers de sites, il compte simplement améliorer son positionnement et augmenter son "PageRank", le plus gratuitement possible. Certains de ces spammeurs vont même jusqu'à déclencher de véritables petites attaques de spams de referer, comparables à des DOS, contre les sites qui ont un excellent PageRank puisque leurs chances d'être visibles eux-aussi de ce fait sur les moteurs de recherche seront bien plus grandes. Sans oublier que certains sites ont la (très) mauvaise habitude d'afficher la provenance de leurs visiteurs et donc, là encore, de faire de la pub à ces spammeurs sans le vouloir.
Dans les cas extrêmes, le spam de referer est capable de faire plier un petit serveur mutualisé, et dans les autres cas de polluer considérablement les logs Apache, mais aussi de dévorer la bande passante. Mais heureusement, nous allons voir que si les spammeurs peuvent nous embêter nous aussi pouvons leur rendre la vie un peu plus dure.
Exemple
Voici tout d'abord un petit exemple de spam de referer (trouvé dans les logs de spamCle@ner), qui plus est pour un site français : europe-backup.com
Si on se rend à l'adresse indiquée, on ne trouvera aucun lien vers spamCle@ner ce qui est une caractéristique typique de ce genre de méthode mais aussi une preuve que Cisneo SARL se livre au spamming de referer. De même les ReverseDNS des IP sont plutôt éloquents :
En faisant un recherche sur google.com de "www.europe-backup.com/archives/?r=" on retrouve pas mois de 152 cas identiques au mien et on voit même que les identifiants après "?r=", modifiés dans l'exemple ci-dessus, sont différents pour chaque site affiché, ce qui laisserait penser qu'ils enregistrent ceux-ci afin de voir parmi les sites qu'ils ont spammé lesquels sont les plus rentables (pour mieux les spammers par la suite?). Idem si vous faites une recherche sur les deux adresses IPs 62.210.233.68 et 62.210.213.254 vous serez étonnés des résultats...
Technique
Nous allons utiliser le module mod_rewrite d'Apache pour nous débarasser des spams de referer. Nous n'allons pas seulement les bloquer mais nous allons aussi nous amuser: les renvoyer d'où ils viennent afin qu'à chaque fois qu'ils voudront manger notre bande passante nous leur ferons manger la leur.
Enfin, car c'est tout de même le plus important, nous feront exactement le contraire de ce qu'ils souhaitent: nous ne garderons aucune trace de leur visite dans les logs de notre serveur.
Exemple ciblé
Dans ce 1er exemple, nous connaissons d'avance le site du spammeur.
Vous pouvez soit créer un fichier .htaccess et le placer à la racine de votre rétoire WWW, soit directement entrer les 3 lignes suivantes dans le fichier Apache de configuration de votre vhost :
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http://www.europe-backup.com [NC]
RewriteRule ^.* http://www.europe-backup.com [L,E=nolog:1]
1ere ligne : activation de mod_rewrite.
2e ligne : rechercher un referer indiquant "http://www.europe-backup.com". [NC] ne fait pas la différence entre majuscules et minuscules.
3e ligne : nous remplaçons l'URL de notre site (^.*) par une redirection vers l'URL du spammeur. [L] indique qu'il n'y a pas d'autres règles à appliquer. Le dernier élément très important est [E=nolog:1]. Cela créé une variable "nolog=1" qui sera utilisée par Apache.
Dans le fichier Apache de votre site, vous avez probablement une ligne à peu près identique à celle-ci :
CustomLog logs/access_log combined
Rajoutez simplement à la fin de la ligne l'instruction "env=!nolog" pour indiquer à Apache de ne rien enregistrer dans les logs lorsque la variable nolog est activée :
CustomLog logs/access_log combined env=!nolog
Vous pouvez donner un autre nom à cette variable, tant que vous utilisez le même nom dans les instructions de mod_rewrite et de la ligne CustomLog.
Il suffit de relancer Apache et dorénavant, à chaque fois que cette société tentera de spammer vos logs, elle sera immédiatement renvoyée d'où elle vient et aucune trace ne sera enregistrée par votre serveur.
Exemple généralisé
Que faire quand, contrairement à l'exemple précédant, nous ne connaissons pas le nom de domaine à l'avance? Cela ne pose aucun problème puisque nous pouvons rediriger le spammeur sur son propre site mais cette fois en utilisant la variable HTTP_REFERER qu'il aura la gentillesse de nous envoyer lui-même. Vous pouvez vous débarasser de beaucoup de site pornographiques, de parapharmacies ou autres casinos en ligne d'une manière globale :
1ere ligne : nous recherchons toute URL de referer contenant l'un des termes entre parenthèses. Vous pouvez en ajouter/supprimer comme vous le souhaitez.
2e ligne : nous remplaçons l'URL de notre site par une redirection vers l'URL du spammeur mentionnée dans la variable HTTP_REFERER reçue.
Et comme dans l'exemple précédant, modifiez Apache pour qu'il n'enregistre pas la connexion dans ses logs :
CustomLog logs/access_log combined env=!nolog
Exemple divers
Si vous préférez que les spammeurs perdent leur temps plutôt que leur bande passante, rallongez indéfiniment les temps de réponse à leurs requêtes en les redirigeant sur localhost (127.0.0.1) ou sur un "trou noir" de l'IANA (IANA's Black Hole) :
Si vous connaissez le domaine du spammeur, recherchez sur son site s'il n'aurait pas un fichier de 10 Mo à télécharger et renvoyez-le dessus. Si vous ne connaissez pas son domaine, vous pouvez le renvoyer sur un gros fichier localisé ailleurs :
Ou bien s'il dispose d'une page de contact, renvoyez-le dessus avec les paramètres du formulaire dans l'URL afin qu'à chaque fois qu'il tentera de vous spammer, il s'enverra lui-même un email en utilisant son propre formulaire (et son IP) :