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>
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) :
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 @ 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@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)
t o t o @ e x a m p l e . c o m
ou encore une variante (mix d'entités HTML et de caractères normaux comme x ou ".")
t ot o @ e x a m p l e. c o m
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>
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é @ 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 : |
 |
example.com |
ou si l'on fixe le border à 0 (encadré "invisible")
toto |
Pour me contacter : |
 |
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 :
|