08/08/2006 à 18h42 : Bloquer le spam sur les forums, blogs, wikis, etc

Tous mes sites sont plus ou moins touchés par le spam de commentaires.
Que ça soit les forums (phpBB), les blogs (DotClear ou solution maison), mon wiki...
J'ai d'abord essayé les techniques suggérées par chaque solution : Mais finalement toutes ces solutions sont : Récemment je suis tombé sur une technique assez élégante que je teste depuis plusieurs jours et qui fait ses preuves.
LinkSleeve est un site qui centralise les liens postés dans les formulaires.
Dès qu'un lien est un peu trop répété, le site suppose qu'il s'agit d'un spam.
L'intégration est assez facile et la solution générique puisqu'elle se base sur des messages XML-RPC.
Comme tous mes sites sont programmés en PHP, j'ai fait un petit script que j'inclue sur toutes mes pages. Si le contenu posté par l'utilisateur passe l'ensemble des tests, le script rend la main au programme initial sans rien dire. Sinon on fait un die pour calmer le spammeur.
Le die fait donc que le spammeur voit une page blanche au lieu du résultat attendu. C'est très moche mais finalement ça a quelques avantages : Evidemment il faut éviter au maximum les faux-positifs ;-)
Voilà à quoi ressemble aujourd'hui le script que j'utilise :
<?
        # log the spam and quit
        function spam_log($reason)
        {
                global $spam_input;
                global $SERVER_NAME;
                # here we can log to a file to monitor the spam
                # ...
                die;
        }

        # get POSTed data
        $spam_input=implode(" ",$_POST);

        # all in one big line
        $spam_input=str_replace("\n"," ",$spam_input);
        $spam_input=str_replace("\r","",$spam_input);

        # if the POSTed vars do not contain any URL, no need to check for spam...
        if (!preg_match('#http#i',$spam_input)) return;

        # if there are too many urls we suppose it is spam...
        if (preg_match('#(http[^ ]* *){3}#i',$spam_input)) spam_log('http');

        # basic list of forbidden words
        if (preg_match('#(viagra|pharmacy|casino|...)#i',$spam_input)) spam_log('word');

        # try linksleeve database
        include('xmlrpc.php');
        $spam_f=new xmlrpcmsg('slv',
                array(new xmlrpcval($spam_input, "string"))
        );
        $spam_c=new xmlrpc_client("/slv.php", "www.linksleeve.org", 80);
        $spam_r=$spam_c->send($spam_f);
        $spam_v=$spam_r->value();
        if (!$spam_r->faultCode())
        {
                $spam_theval=$spam_v->scalarval();
                if ($spam_theval!=1) spam_log('sleeve');
        }
?>
Attention, c'est du "quick & dirty (tm)", et c'est adapté pour mes besoins maisons. En gros les étapes sont :
J'ai affiné ma liste de mots à partir des URL qui sont filtrées par LinkSleeve justement, ça me permet d'éviter de trop "bourriner" LinkSleeve.
Certains scripts suggérés par LinkSleeve ne testent d'ailleurs pas la présence d'une URL dans le contenu avant de soumettre celui-ci, alors que ça économise pas mal de requêtes. Heureusement tous les commentaires ne contiennent pas forcément un lien...
Au final je récupère un joli fichier de log, qui me permet d'affiner un peu plus mon script !

J'ai hésité entre l'anglais et le français pour ce billet, l'anglais était adapté vu que les commentaires de mon code sont déjà en anglais, mais maintenant que je suis agrégé sur planet.amglr.net, je ne peux plus tout me permettre :-p

Commentaires

Pseudo :
Site : (facultatif)
Email : (facultatif, pour votre avatar)
Message :
(pas de HTML)
: (recopiez le texte)
Se souvenir de mes informations

Royale [ 14/08 - 22:02 ] : C'est pour faire baisser le taux de clic qui est trop fort sur cette page ;)

Nono [ 14/08 - 12:45 ] : Le '''iframe src="/vrac/sexy-string.php"''' en commentaire dans la page, c'est fait exprès ???

Royale [ 11/08 - 22:57 ] : Nono : Tiens j'avais oublié que j'avais encore ce truc caché ;) Je viens de l'enlever merci :-p

Nono [ 11/08 - 20:14 ] : J'ai regardé le code HTML de tes pages: petit coquinou :D

Royale [ 11/08 - 16:18 ] : Je peux aussi filtrer les données que j'envoie avant de les soumettre ;) Et déjà je n'envoie que quand il y a une URL.

Fladnag [ 11/08 - 10:23 ] : hum... donc ton site en question centralise une liste de spam et recoit chaque seconde des milliers de données de formulaire qui contiennent eventuellement des adresses mails en clair pour certains, et il peut les stocker, les utiliser, voir les revendre a ces meme entreprises de spam... une entreprise certainement lucrative... je suis parano, certes, mais ca ne me plait pas de savoir qu'un formulaire est "validé" par un site tiers

Royale [ 11/08 - 08:21 ] : Ca a l'air pas mal aussi :)

Nono [ 10/08 - 19:25 ] : Z'et tu penses quoi de typekey ?

http://www.sixapart.com/typekey/

Nono [ 10/08 - 19:21 ] : Et tu n'a pas un système contre les utilisateurs insultants et idiots ?

/me en a marre de ne pas savoir pourquoi parfois il se prend des insultes de petits crétins proteges par l'anonymat sur son blog, encore un aj.

huats [ 10/08 - 18:54 ] : C'est ce que j'allais te dire : un billet en anglais c'est pas génant... Et je pense que sur planet.amglr.net on en verra quelques uns d'ailleurs. Ne serait que les prochains que nous mettront :-P

Eric [ 10/08 - 18:34 ] : Je pense que le fait d'être agrégé ne t'empêche pas de poster en anglais. En tous cas personnellement, un billet en anglais, je le lirai autant qu'un en français.

Royale [ 08/08 - 20:38 ] : Julien : si je ne me trompe pas, c'est de la modération à postériori des commentaires, ça ne te fait pas trop de boulot ?

Julien [ 08/08 - 20:29 ] : Pas mal comme technique.
En revanche, c'est vraiment une course sans fin puisqu'au prochain coup, les nouveaux spams auront des url différentes et autres techniques de sioux...

Je suis vraiment satisfait de ma technique personnelle :-)