Intro Editorial A Propos Sommaire Quizz Musiques Pub Archives
Obligement


Dossier : les Spams (2è partie) par Arnaud Danassié



Spam Wars - Episode II

Tous les moyens sont bons pour un spammeur pour avoir un maximum d'adresses email valides. Aussi certains de ces ignobles individus ont rapidement recyclé des méthodes et outils utilisés par les moteurs de recherche (Google par exemple) pour programmer des scripts ou des robots ("bots" pour les intimes) afin de moissonner sur le net des dizaines de milliers voire des millions d'adresses emails bonnes à spammer ou à revendre à d'autres sociétés peu scrupuleuses sur l'origine des sources de collecte.

Bref si vous commencez à mettre en page quelques pages webs et vous voulez compliquer au maximum la vie de ces robots (renifleurs, aspirateurs d'emails,...) vous trouverez ci-dessous quelques conseils qui pourront vous être utiles. Ne les confondez pas avec les bots des moteurs de recherche qui sont généralement civilisés et respectent un minimum les indications des fichiers robots.txt par exemple (voir le lien en référence pour plus d'informations). Leur seul but est de collecter un maximum d'email en parcourant page après page les sites webs pour relever les balises "mailto:" contenues dans les liens et tout ce qui ressemble de près ou de loin à un email (de la forme email@domaine.suffixe) en examinant notamment les infos textuelles (METAs, ALT des balises IMG, contenu texte des tables, etc.). N'ayez donc aucun scrupule à blinder un minimum votre site web contre ces "vampires" ;-).

Les mailto:

N'utilisez absolument aucun "mailto:email@domaine.suffixe" dans vos liens (ou formulaires) de type
<A HREF="mailto:toto@example.com">toto@example.com</A>

ou encore
<FORM METHOD="POST" ACTION="mailto:toto@example.com">
...
</FORM>

Le mailto: une mauvaise habitude !


La balise mailto: était une très bonne idée à l'origine mais elle a été rapidement détournée de son usage notamment à cause des scripts de collecte automatique d'emails. Si vous avez un très bon filtre antispam ou du temps à perdre à effacer manuellement les emails inopportuns à chaque fois que vous relevez vos emails vous pouvez mettre en clair votre email (la plupart des sociétés commerciales par exemple sont bien obligées de mettre un email de contact mais généralement elles prennent leurs dispositions pour filtrer les visiteurs indésirables).

Certains utilisent donc des comptes emails jetables (genre comptes secondaires Free, Yahoo, Club-Internet, etc. facilement remplacables dès qu'ils sont spammés) mais cela oblige à une certaine gymnastique (ouvertures et clotures de comptes) qui en rebutera rapidement certains. Des sites comme Spamgourmet.com (je cite celui là car il est traduit en Français mais il existe plusieurs autres du même style) vous proposent un service d'emails jetables : en fait ce sont des alias de votre compte email véritable mais qui sont valides pour 1, 2 ou n emails (vous fixez sa période de validé à "n" emails) avant de s'autodétruire (le spammeur qui aura collecté votre adresse ne pourra pas l'utiliser mais revers de la médaille, la personne qui voudrait vous joindre une n+1ème ou n+2ème fois sans avoir votre véritable email devra repasser par votre site web pour avoir votre email actuellement valide sinon elle risque d'envoyer un email sur une adresse périmée).

Un bon test pour vérifier si votre email est facilement "aspirable" consiste à utiliser le moteur de recherche www.google.fr et faire une simple recherche avec votre email en argument (toto@example.com dans le reste de notre article).

Les brosses

La manière la plus simple de camoufler vos emails aux yeux des robots trop curieux est de générer une petite brosse reprenant votre email sous une forme plus ou moins travaillée : en effet, à l'heure ou j'écris ces quelques lignes, quasiment aucun bot ne charge (et encore moins interprète via un programme d'OCR) les images PNG/GIF/JPG et la plupart s'attaquent en priorité aux données textes (HTML ou autre) plus faciles à travailler...

Quelques secondes sous votre programme de dessin habituel (FxPaint, PPaint ou autre Photoshop si vous travaillez sous l'OS de la pomme ou des fenêtres) suffisent donc à vous générer une brosse PNG par exemple. Les quelques exemples ci-dessous ont pour leur part été générés avec une ou deux lignes de Rebol (voir lien en référence pour les personnes intéressées par le source) :

1er exemple de brosse email

2ème exemple...

Une brosse avec un fond dégradé et des caractères de largeurs et hauteurs différentes sera bien évidemment plus compliquée à décrypter par un "bot" qu'une brosse deux couleurs bien contrastée que certains outils de petits malins savent déjà interpréter (à titre d'anecdote Yahoo mail utilise un système de brosses dynamiques pour compliquer la vie des scripts qui ouvrent automatiquement des tas d'adresses emails pour spammer notamment mais ils ont du complexifier leurs brosses (polices déformées, fonds variés, etc.) car certaines personnes (au MIT notamment) avaient déjà trouvé des parades en utilisant un système de reconnaissance de caractères adapté).

Cette solution présente hélas un inconvénient de taille : les utilisateurs qui surfent sans afficher les images (des utilisateurs de Lynx aux Geeks en passant par certaines personnes handicapées visuelles ne peuvent voir ou entendre votre email !). Ne mettez surtout pas votre email dans le tag ALT même sous la forme d'un ALT="Ecrivez moi à l'adresse toto at example dot com" (on lit courament l'email toto@example.com sous la forme de toto "at" (chez) example "dot" (point) com soit "toto chez example point com" ou example.com est le nom de domaine).
Il serait plus judicieux d'utiliser un tag ALT du style ALT="Chargez cette image pour obtenir mon email".

Utiliser des entités HTML

Un truc très souvent utilisé consiste simplement à remplacer le symbole @ d'une adresse email par sa correspondance HTML &#064; mais bien évidemment 95% des bots savent convertir à la volée les entités HTML en caractères "normaux" donc ce truc est quasiment inutile (s'il est utilisé seul) pour les égarer.

Ainsi avec un email bidon toto@example.com cela donne la notation HTML toto&#064;example.com ce qui affiche toto@example.com.

De la même façon il est inutile d'utiliser la notation (email exprimé entièrement en entités HTML) &#116; &#111; &#116; &#111; &#64; &#101; &#120; &#97; &#109; &#112; &#108; &#101; &#46; &#99; &#111; &#109; ou encore une variante (mix d'entités HTML et de caractères normaux comme x ou ".") &#116; ot &#111; &#64; &#101; x &#97; &#109; p &#108; e. &#99; &#111; &#109; pour écrire toto@example.com dans vos pages HTML.

Ainsi les quatres exemples suivants s'affichent à l'identique dans un navigateur mais ne tromperont que peu de bots (affichez le source HTML de cet article pour les détails ;-(.
  • toto@example.com
  • toto@example.com
  • toto@example.com
  • toto@example.com

La bonne vieille méthode "descriptive à la usenet"

L'idée de base est simple et reste très utilisée dans les newsgroups (terrain de chasse très parcouru par les bots depuis des années) : communiquer la bonne adresse email sans utiliser le format classique nom@domaine.suffixe par des trucs dont certains sont maintenant bien connus et utilisés par les bots. En voici quelques variantes avec notre email toto@example.com :

toto "at" example "dot" com
toto at example.com
toto at example dot com
toto chez example point com
toto@nospam.example.com (enlevez le nospam pour m'écrire)
toto-no@spam.example.com (enlevez le nospam pour m'écrire)

Toutes ces notations sont maintenant courament contournées par les scripts les moins basiques... Par contre les notaions qui suivent sont encore relativement efficaces :

toto@exampleAMIGARULEZ.com (enlevez AMIGARULEZ pour m'écrire)
toto@rougeexample.com (enlevez la couleur pour m'écrire)
toto@examplemouton.com (enlevez Edmond le ... pour m'écrire)
toto@XZQYFJKLMWZXexample.com (oter les lettres XZQYFJKLMWZX et la lumière jaillira)

Soyez créatif et vous aurez plus de chance de passer entre les mailles du filet. A noter qu'il vaut mieux vérifier que le domaine examplemouton.com ou XZQYFJKLMWZXexample.com n'existe pas !

Javascript (ECMAScript) rules !

Une autre solution est d'utiliser un javascript pour générer le "mailto:" avec l'email voulu à la volée (voir exemple ci-dessous). Cette solution présente hélas l'inconvénient de ne pas fonctionner sur tous les navigateurs (support javascript désactivé, etc.) mais elle est très efficace.
<script language="javascript">
<!-- 
var chien = "com";
var lapin = "toto";
var chat = "@example";
var cheval = "mail" + "to:" + lapin + chat + "." + chien;
document.write("<form>");
document.write("<input type=\"submit\" value=\"Envoyez moi un email\" ");
document.write("onclick=\"parent.location=cheval\"> ");
document.write("</form>");
// -->
</script>

Ce qui nous génère donc un bouton de formulaire classique "Envoyez moi un mail" :

Vous noterez qu'on utilise ici des noms de variables fantaisistes (chien, chat, cheval, etc.) et qui n'ont aucun rapport avec leur contenu... Si tout le monde appelait "email" sa variable contenant l'email cible, on faciliterait trop le travail des "méchants" qui n'auraient plus qu'à parser les fichiers visités pour débusquer nos précieuses adresses.

Tous les javascripts utilisent des astuces plus ou moins complexes pour crypter l'email de la personne à protéger : pour ma part, je donnerais un "javascript d'or" à l'excellent script "EMail protector" de Jim Tucek dont vous trouverez le lien en fin d'article. Il a reçu un jour un spam pour vanter les mérites d'un outil antispam (il faut vraiment être crédule pour répondre à une proposition commerciale pour acheter un outil antispam envoyée via un spam !) et il a tout simplement développé un script qui utilise deux nombres premiers pour générer un mailto: avec votre email crypté en RSA (10 bits) et qui sont décodés via un excellent javascript.

Le mailto: vers toto@example.com devient donc un appel vers la fonction javascript de décryptage du genre :
<A HREF='javascript:bid("165 555 165 555 11 233 404 526 523 519 90 233 145 511 555
523 195 210 376 224 501 233 511 165 150 464 210 210 526 364",703,389)'>Me contacter</A>


La fonction de décryptage en elle-même doit être insérée dans l'entête de votre page HTML (entre les deux balises <head> et </head> donc juste avant la balise <body> qui commence la description de la page en elle-même) :
<SCRIPT LANGUAGE='JAVASCRIPT'>
// <!-- 1863645430
// This script is (C) Copyright 2002 Jim Tucek
// Leave these comments alone!  For more info, visit
// www.jracademy.com/~jtucek/ 

function bid(alchemy,animal,approval) {
alchemy += ' ';
var camera = alchemy.length;
var punishment = 0;
var center = '';
for(var custom = 0; custom < camera; custom++) {
punishment = 0;
while(alchemy.charCodeAt(custom) != 32) {
punishment = punishment * 10;
punishment = punishment + alchemy.charCodeAt(custom)-48;
custom++;
}
center += String.fromCharCode(mistake(punishment,animal,approval));
}
parent.location = 'm'+'a'+'i'+'l'+'t'+'o'+':'+center;
}

function leave(square,structure,farm) {
square += ' ';
var furnace = square.length;
var image = 0;
for(var incredulity = 0; incredulity < furnace; incredulity++) {
image = 0;
while(square.charCodeAt(incredulity) != 32) {
image = image * 10;
image = image + square.charCodeAt(incredulity)-48;
incredulity++;
}
document.write('&');
document.write('#');
document.write(mistake(image,structure,farm));
}
}

function mistake(hieroglyphic,lip,book) {
if (book % 2 == 0) {
moon = 1;
for(var butterfly = 1; butterfly <= book/2; butterfly++) {
way = (hieroglyphic*hieroglyphic) % lip;
moon = (way*moon) % lip;
}
} else {
moon = hieroglyphic;
for(var mortality = 1; mortality <= book/2; mortality++) {
way = (hieroglyphic*hieroglyphic) % lip;
moon = (way*moon) % lip;
}
}
return moon;
}
// -->
</SCRIPT>

Rendez-vous sur la page http://www.jracademy.com/~jtucek/email/download.html pour une petite démonstration (notez au passage que les noms des variables et fonctions utilisés par son script (ici bid, alchemy, custom, caméra, mistake, mortality, hieroglyphic, etc.) sont aléatoires ce qui évite aux petits malins de repérer trop facilement les pages utilisant son script). A première vue, ce script fonctionne très bien sous Voyager et Ibrowse (ainsi qu'IE, Opéra, Netscape/Mozilla, Safari/Konqueror, etc.) mais Aweb sèche dessus apparemment (support incomplet de certaines fonctions ecma/javascript).

Webmestre : au tableau !

Il y a quelques années, certains ont aussi eu l'idée de décomposer l'email affiché en plusieurs parties dans une table simple du genre (avec border=0 mais ici je le fixe à 3 pour afficher un encadré).
<table border=3>
  <tr>
    <td>toto</td>
    <td>@</td>
    <td>example.com</td>
  </tr>
<table>

ce qui affiche bien

toto @ example.com

Rapidement sont alors apparus des scripts/bots qui éliminaient les balises HTML inutiles (ici balises table tr et td) et aspiraient donc l'adresse toto@example.com que la plupart d'entre eux n'avaient alors aucune peine à convertir en toto@example.com ;-(.

Une des solutions pour contourner ces scripts consiste simplement à compliquer un chouilla la table de manière à générer un résultat idiot pour le bot (ici "toto Pour me contacter : example.com" s'il filtre les balises HTML) et à utiliser par ailleurs une brosse GIF ou PNG pour l'arobase plutôt que le caractère @ ou son entité &#064; trop "repérables" (la brosse est ici volontairement trop grande).

Voici donc notre source modifié :
<table border="3">
  <tr>
   <td rowspan="2" valign="bottom">toto</td>
   <td align="left" colspan="2">Pour me contacter :</td>
  </tr>
  <tr>
   <td><img alt="Commentaire bidon" width="47" height="47" src="gfx/spam-chez.gif" /></td>
   <td valign="bottom">example.com</td>
  </tr>
</table>


Ce qui nous affiche donc

toto Pour me contacter :
Commentaire bidon example.com


ou si l'on fixe le border à 0 (encadré "invisible")

toto Pour me contacter :
Commentaire bidon example.com


Conseil : n'appelez pas votre brosse réprésentant l'arobase avec un nom style at.gif, chez.gif ou arobase.png mais plutôt avec un nom passe-partout sans aucun rapport avec son contenu.

Utilisez des formulaires au lieu d'un lien direct sur l'email ou vers une autre page

Cette solution ne présente quasiment que des avantages :

- Tous les navigateurs la supporte,
- Votre email n'apparait jamais directement en clair,
- Même les personnes sans email (utilisateurs occasionnels d'internet par exemple) peuvent vous contacter rapidement.

C'est typiquement le principe utilisé par les scripts pour les "Livres d'Or".

Seule petite précaution à prendre, il faut utiliser la méthode POST (car la méthode GET est plus facile à analyser puisque les variables apparaissent généralement en clair dans l'URL qui a la forme http://www.example.com/toto.html?variable1=valeur1&variable2=valeur2&variable3=val... etc. et peuvent donc se faire intoxiquer par un script qui exploite cette faille) avec un script CGI (perl, C) ou PHP en argument ACTION qui redirige les données collectées vers l'email ou la page correspondante.

L'avantage d'un script PHP est qu'il restera toujours "invisible" aux bots au contraire d'un script perl par exemple qui pourra être parsé et analysé un jour ou l'autre par un programme qui ne respectera pas le robots.txt et visitera le répertoire /cgi-bin/. Vous pourrez d'ailleurs trouver quelques scripts PHP prochainement sur mon site web qui exploitent plusieurs techniques explicitées dans cet article.

De la même façon, vous pouvez utilisez un système de menu déroulant (formulaire avec la méthode POST + javascript + script cgi / PHP ou autre) pour naviguer sur votre site et égarer ainsi la plupart des bots des spammeurs (mais aussi les bots des moteurs de recherche donc utilisez ce genre de techniques à bon escient !).

Conclusion

Comme le dit le proverbe, "il ne faut pas mettre tous ses oeufs dans le même panier". Pour vos pages web, c'est exactement pareil : il est très important que tout le monde n'utilise pas exactement la même technique de camouflage email sinon inévitablement les spammeurs vont se concentrer rapidement sur cette technique "rentable à contourner" pour trouver une faille et reprendre leurs activités en toute tranquillité.

Généralement j'utilise un mélange de plusieurs des techniques précédentes (brosses, tables et formulaires + php) ce qui permet d'éviter une grande partie des bots moissonneurs de spams (plus de 99%). J'espère que cet article vous aura donné quelques idées sympathiques de mesures de protections "en amont" du spam : nous verrons une prochaine fois comment piéger ou intoxiquer les robots des spammeurs avec de fausses données.

La guerre spammeurs-spammés continue de plus belle.

Références :

Visiter spamgourmet.com