La solution ultime contre les spams avec WordPress

La solution ultime contre les spams sous WordPress

Ok, je m’enflamme peut-être sur le titre, mais je suis assez content de cette solution qui m’a permis de réduire drastiquement le nombre de spams dans la file d’attente Akismet.

De quels spams il est question ?

Je ne parle pas des spams déposés manuellement par de vrais visiteurs qui cherchent des backlinks par très subtilement, mais de ceux des spambots, ceux qui parlent de chaussures de sport, de sacs de luxe et de petites pilules bleues.

Ces spams qui tombent dans la liste des indésirables d’Akismet.

Mais alors quel est le problème s’ils sont interceptés ?

C’est simple : j’étais arrivé à environ 1500 spams par jour, ce qui provoquait une augmentation considérable de la taille de la base de données, même une fois la liste des spams nettoyée.

Bien sûr, il existe des extensions qui purgent la liste des spams automatiquement et qui nettoient les tables, mais je voulais résoudre le problème plus en amont.

J’exclue également l’utilisation de captcha, personnellement je préfère vous laisser commenter sans ajouter de contrainte. Alors n’hésitez pas !

La solution contre les spambots sous WordPress

Cette solution est une sorte de pot de miel pour spambot.

Le principe est simple : utiliser le champ qui permet d’indiquer l’URL de son site comme un leurre, et créer un nouveau champ pour le remplacer pour les vrais visiteurs.

Bien sûr, le leurre est caché aux véritables visiteurs qui ne peuvent pas le renseigner.

Ainsi, si le leurre contient des données, le commentaire est un spam.

Le code qui suit peut être inséré dans le fichier functions.inc.php, comme d’habitude.

Phase 1 : création d’un champ plus vrai que nature

Au moment de l’affichage du formulaire qui permet de commenter, ce code affiche le nouveau champ qui permet aux véritables visiteurs d’indiquer l’URL de leur site, et simplifie le champ original pour le transformer en leurre pour spambot.

// Ajout le nouveau 'vrai' champ et change celui qui existe en leurre à spambot
function addAntiSpambotField($fields) {
	$newUrlFieldName = "url2";
	$fields["url2"] = str_replace(array("for=\"url\"", "id=\"url\"", "name=\"url\""), array("for=\"$newUrlFieldName\"", "id=\"$newUrlFieldName\"", "name=\"$newUrlFieldName\""), $fields["url"]);
	$fields["url"] = '<input type="url" id="url" name="url" value="">';
	return $fields;
}
add_filter("comment_form_default_fields", "addAntiSpambotField");

Phase 2 : vérification du faux champ de formulaire

Une fois le commentaire soumis, il ne reste plus qu’à vérifier que le leurre est toujours vide.

// Vérification du leurre au moment de l'ajout du commentaire
function checkAntiSpambotField($commentId) {
	if ($_POST["url"] !== "")
	wp_die("<strong>ERREUR</strong>: Vous devez passer par le formulaire de commentaire du site. Si c'est le cas, et que vous voyez ce message, je vous remercie de prévenir l'administrateur par la page de contact.");
}
add_action("pre_comment_on_post", "checkAntiSpambotField");

Phase 3 : on remet les données dans l’ordre

Si le commentaire a pu passer la vérification, il reste l’enregistrement de l’URL renseignée dans le nouveau champ pour que WordPress la prenne en compte.

// Remet les informations dans l'ordre pour la validation
function preprocessAntiSpambotField($commentdata) {
	if (!$commentdata["comment_type"] && isset($_POST["url2"])) {
		$commentdata["comment_author_url"] = $_POST["url2"];
	}
	return $commentdata;
}
add_action("preprocess_comment", "preprocessAntiSpambotField");

C’est aussi simple !

Phase 3 : un peu de décoration

Enfin, le leurre doit être caché, grâce à CSS.

#commentform #url {
	display: none;
}

Un détail : avec le thème Twenty Thirteen, il faut aligner le ‘nouveau’ champ comme les autres :

.comment-form [for="url2"] {
	float: left;
	padding: 5px 0;
	width: 120px;
}

Le mot de la fin

Comme je vous le disais, Akismet bloquait environ 1500 spams par jour. Une fois la solution mise en place, je suis descendu à moins d’un par jour !

Pour information, la raison est simple : l’URL du commentaire n’est pas renseignée, contrairement à son contenu qui est bourré de lien.

Enfin cette solution est valable pour les commentaires, mais en l’état, elle ne fonctionne pas pour les formulaires (de connexion ou autre).

En même temps, c’est déjà pas mal ?

Cet article vous a été utile ? Partage it !

11 réflexions au sujet de « La solution ultime contre les spams avec WordPress »

  1. Je vais peut-être le tester sur un de mes sites pour voir. Perso, j’ai installé la dernière version de Cookies for Comments et désactivé Askimet – Cookies ne fonctionnait pas avec les plugins de cache et il semble que ça ait été résolu. Pour l’instant, j’ai dû voir passer deux spams en quinze jours.

    1. Bonjour Li-An,
      Efficace 🙂
      J’avais pensé aux cookies et à JavaScript, en passant par une extension ou non, mais j’ai préféré une solution qui évite de se reposer sur le navigateur. Ici tout se passe côté WordPress.
      En même temps, avec nos navigateurs modernes, les cookies et JavaScript font très bien l’affaire. 🙂
      David

  2. Salut David,

    Personnellement, j’utilise NoSpamNX depuis plus de 18 mois et il m’offre pleine satisfaction. Il faut juste désactiver l’autorisation des notifications par ping, car des petits malins passent par là et NoSpamNX n’est pas conçu pour gérer cela.
    Mais ce n’est pas grave puisqu’il est de toute façon vivement déconseillé de valider les notifs de pings.
    Et sinon, autre solution qui semble faire ses preuves sans aucun codage ni plugin: la fermeture automatique des commentaires au bout de 20 jours, puisque statistiquement les robots spammeurs trouvent les nouveaux articles au bout du vingt-et-unième jour après publication.

    Amicalement,

    Bruno

    1. Bonjour Bruno,
      Intéressant pour NoSpamNX, et aussi la durée moyenne de tranquillité avant de se faire polluer.
      Dans mon cas, avec des articles qui n’ont pas de date limite et dans lesquels je peux répondre aux interrogations de mes lecteurs, la fermeture des commentaires n’est pas très adaptée.
      Mais dans certains cas c’est une excellente solution.
      David

  3. Lorsque tu fermes les commentaires, tes lecteurs ont toujours la possibilité de t’interroger via le formulaire de contact.
    Il arrive parfois que certains de mes lecteurs utilisent justement mon formulaire de contact pour me poser une question ou me donner un conseil ou une suggestion, et si c’est probant, alors j’ajoute moi-même leur commentaire au fil de discussion.
    Ça prend certes une ou deux minutes à faire, mais vu que j’économise bien plus de temps en amont, cela ne me dérange absolument pas.
    Et sinon, sans vouloir t’effrayer, j’ai soumis ton astuce à un ami qui fait dans l’automatisation et il m’a dit que ton astuce ne posait absolument aucun problème à ses robots (je te rassure, il arrive également à passer NoSpamNX et nous regardons justement ensemble comment le modifier pour que ça ne passe plus).

    Amicalement,

    Bruno

    1. Alors que tu t’ajoutes des contraintes ne me choque pas (encore que…), mais en ajouter à tes lecteurs…
      En effet, ils doivent trouver le formulaire de contact, et en plus rappeler le contexte (de quel article il s’agit).
      J’imagine que certains ne prennent pas la peine de poursuivre.
      C’est d’autant plus étonnant que ton antispam est efficace.

      Sinon tu ne m’effraies pas 🙂
      Il y a toujours une solution de contournement, que ce soit pour le spambot que pour la contre mesure.
      Et ce qui est positif, c’est que ce concept est applicable à tout ce qui nous entoure, et permet l’innovation 🙂
      Enfin bref, comme la méthode que je présente a divisé par mille le nombre de spams que je recevais, elle peut être utile à beaucoup de possesseurs de blog ou de site sous WordPress.

      Et je suis curieux de connaître le résultat de votre investigation 🙂

      Amicalement aussi 🙂

      David

  4. Salut David,
    Je trouve ta solution intéressante, même si je n’ai pas autant de spams que ce que tu recevais… !!!
    Juste une question avant de me lancer dans la modif : je viens aussi de lire ton article « Trois méthodes pour personnaliser le code de WordPress » et je voulais savoir s’il était préférable de mettre cette modif anti-spam dans le functions.php de mon thème enfant ou de créer un plugin spécialement pour ça ?
    D’après ce que j’ai compris de ton autre article, ce serait mieux de mettre cette modif dans un plugin pour qu’elle perdure, même si je change de thème. Non ?
    Merci de me redire, à +,
    Jérémie

    1. Bonjour Jérémie,
      Alors pour le coup, je l’ai mise dans le thème enfant, comme j’ai dû faire une modification du CSS pour aligner les labels, et que cette modification est liée au thème parent en particulier.
      David

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Si vous le souhaitez, renseignez le champ 'Nom' de cette façon : 'VotreNom@VotreMotClef' pour obtenir une ancre optimisée pour les moteurs de recherche.