Anti-spam email en Javascript

Mathieu Chartier Programmation 2 commentaires

Tout webmaster se retrouve confronté à la gestion des spams provenant des formulaires de contact ou des adresses email errant dans les pages web des sites. Une fois captée par des robots ou autres bases de données virales, les adresses sont utilisées jusqu'à ce que mort s'en suive pour développer un spam plus embêtant que dangereux...

Plusieurs techniques existent pour limiter (et non "stopper") le spam provenant des sites web, avec plus ou moins de réussite. L'idéal est parfois de coupler ces techniques pour arriver à des fins valables.

  1. Remplacer le @ par le [at] : technique ancestrale utilisée tantôt pour faire style (ça faisait très "tendance" à l'époque), tantôt pour éviter que l'ancre de l'email ne soit captée ;
  2. Utiliser un système Captcha pour obliger les utilisateurs à taper quelques lettres (à la limite du lisible) générées par des codes non lisibles par les "robots-spams". Cette technique est encore largement utilisée car assez efficace et souvent aisée à mettre en place. Le principal défaut retenu est la lisibilité des lettres qui peut parfois faire fuir l'internaute désireux d'écrire un message... Le captcha pose en outre le problème des sessions PHP selon le script que vous utilisez, et il n'est pas toujours agréable de voir des sessions ouvertes laissant un champ libre à certains pirates malveillants ;
  3. Utiliser des scripts peu lisibles par les robots afin de limiter le spam. Beaucoup existent et sont de qualité, je n'en détaillerai qu'un dans la suite de cet article. Je ne garantis pas que ce soit le meilleur, loin de là, mais il limite tout de même les messages indésirables. Le langage Javascript étant souvent utilisé pour coder ce type de fonction bloquante, nous suivrons cette voie...

Avant toutes choses, il est bien nécessaire de repérer toutes les mentions de vos adresses emails dans les pages web (si elles utilisent un mailto: notamment). Une fois identifiées, il faudra créer un lien (link) dans le <head> de votre page afin de relier la page avec le fichier Javascript que nous allons créer. Inutile d'ajouter systématiquement le link dans toutes les pages web, ce serait un chargement de trop dans les pages non concernées par le spam par email (à l'heure où le PageSpeed domine le développement, nous pouvons au moins respecter ce critère...).

<script src="URL_DU_FICHIER.js"></script>

Le fichier Javascript sera très court - voire compressé - avec un code simpliste (et adaptable) :

function emailModifAncre(name,domaine,ancre) {
    var arobase=('@');
    document.write('<a href="mailto:"'+name+arobase+domaine+'"'+ancre+'</a>');
}

L'idéal étant de faire une fonction adaptable et permettant des variantes, j'insère en variable de fonction le titre de l'email ("name" ici) puis le nom de domaine ("domaine" ici), séparées par une variable contenant l'arobase. Souhaitant utilisée des ancres parfois différentes de l'adresse email, je crée une variable "ancre" permettant éventuellement d'écrire un [at] plutôt qu'un @ classique, etc. Tout le système repose sur le document.write souvent mal interprété par les robots.

L'utilisation dans le site est alors un jeu d'enfant, il suffit de placer ce bout de code à l'endroit destiné à l'adresse email :

<script>emailModifAncre('nom-de-mon-email','nom-de-domaine.extension','ancre-email');</script>

Voici donc une technique simple pour contrer le spam par email et éviter la suppression continuelle de messages dès que votre site génère un tant soi peu de visites...

Une deuxième technique un peu plus élaborée permet de remplacer l'arobase par un signe quelconque (mais qu'on ne trouve pas dans les adresses email si possible) au dernier moment avec la fonction "replace" en Javascript :

function emailReplace(email,ancre) {
var separateur = '#';
var emailreplace=email.replace(separateur,'@');
document.write('<a href="mailto:'+emailreplace+'">'+ancre+'</a>');
}

La mise en place dans le site web reste sensiblement la même que celle du script précédent, il faut juste changer la fonction par emailReplace et insérer l'email complet avec le signe à modifier :

<script>emailReplace('contact#nom-de-domaine.com','Ancre email');</script>