Mailcrypt, système antispam

Ce système de traitement des liens vise trois objectifs :
-  protéger efficacement les adresses email [1] contre les robots spam ;
-  garder des liens e-mails directement utilisables sur la page ;
-  avoir une version imprimée de la page qui présente tous les liens (e-mail et web) en clair.

Note (24/09/2007) : Ce sont maintenant deux outils du plugin Couteau Suisse qui reprennent et améliorent le fonctionnement de ce plugin qui est désormais périmé. Les deux outils sont Mailcrypt et Liens en clair. Ce dernier s’occupe de l’affichage des pages imprimables.

Note (10/6/2007) : avec l’aide d’Alexis Roussel ce script a été converti en plugin pour Spip 1.9.x ; il est disponible sur la zone parmi les plugins stables.

Le plugin est évidemment beaucoup plus simple à installer/désinstaller que la contrib pour Spip 1.8.3. Mais comme le plugin fonctionne essentiellement de la même façon que l’ancienne contrib, je laisse l’explication de cette dernière en place sur cette page...

Introduction à la contrib pour Spip 1.8.3

Cette méthode [2] ne touche pas au noyau de Spip. Si, à première vue, elle semble compliquée, c’est parce que l’installation touche à plusieurs fichiers :

  1. ecrire/mes_options.php3 (script pour transformer les liens) ;
  2. mes_javascripts.js (script pour décoder les liens) ;
  3. commat.gif (image d’une arobase) ;
  4. création d’une squelette « version imprimable » ;
  5. squelette(s) (ajouter 2 lignes : inclusion de mes_javascripts.js et lien pour appeler la version imprimable).

Ces 5 étapes sont décrites en détail plus bas.

Description

La page à l’écran

Un raccourci e-mail [->quelquun@autre.part.org] est d’habitude converti en HTML de la façon suivante :
<a href="mailto:quelquun@autre.part.org" class="spip_out">quelquun@autre.part.org</a> — ce qui laisse le champ ouvert pour les robots spam.

Intercepté par le code que nous mettons dans mes_options.php3 ce lien va être réécrit pour devenir :
<a href="#" title="quelquun..&aring;t..autre.part.org" onClick="location.href = dolink(this.title); return false;">[Email]</a>

Il n’y a plus d’arobase ni de « mailto» pour orienter les robots. Lorsque le visiteur clique sur le lien c’est le JavaScript onClick qui est exécuté. Ce script reconstitue le lien.

Et si le visiteur n’a pas JavaScript ? (Il s’agit vraiment de très peu de personnes.) C’est certain : ils ne pourront pas utiliser le lien. Ils peuvent pourtant lire l’adresse en survolant le lien avec la souris. Pour aider ceux qui ont ce problème, je mets un mot explicatif sur la page « technique » du site :

Parce que le spam est devenu un problème grandissant, nous sommes très prudents dans la manière de mettre publiquement à disposition des adresses e-mail. Celles-ci ne figurent pas sur les pages de ce site, mais sont créées uniquement au moment où le visiteur clique sur un lien. Les visiteurs qui n’ont pas Javascript ou un programme e-mail ne pourront pas utiliser le lien. Cependant, quand le curseur passe sur le lien, un « infobulle » apparaît avec l’adresse e-mail (sous une forme difficile à lire pour les robots spam, mais dont la plupart des visiteurs pourront faire usage).

La version imprimable

Cela ne sert à rien d’imprimer une page d’informations avec les adresses e-mail cachées. Cette page, par exemple, ne vaudrait pas grand-chose reproduite sur du papier.

Pour la version imprimable donc (cliquer sur le lien « version imprimable ») on transforme le lien autrement. On rend l’adresse e-mail visible (dans le cas où elle a été cachée derrière le lien) en remplaçant l’arobase avec une petite image d’arobase. L’adresse s’imprime donc sur papier, mais il n’y pas de lien cliquable à l’écran de cette version imprimable. Tant qu’on y est, on fait la même chose pour les liens web. [3]

Installation

1. Le script principal
Dans un fichier mes_options.php3 (à créer, si tu n’en a pas déjà, dans le répertoire /ecrire) ajouter cette fonction [4] :

<?php
function apres_propre($texte) {
// Antispam
// Dernière mise à jour : 1/12/2005
//
// Variables qui peuvent être modifiées à volonté mais si $arobase est modifiée
// if faut aussi modifier la fonction JavaScript "dolink"
$arobase = '..&aring;t..';  // tip visible OnMouseOver
$affichage = '[Email]';  // affichage par défaut d'un lien mail sans texte
// *** pour version imprimable
if ($_GET['printver']) {
	$masque = '<img src="IMG/commat.gif" alt="" width="13" height="13" style="vertical-align: middle;" />';
	preg_match_all('/<a[\\s]{1}[^>]*href=["\']?([^>\\s"\']+)["\']?[^>]*>([^<]*)<\\/a>/is', $texte, $found);
	$total = count($found[0]);
	for($i=0; $i < $total; $i++) {
		if (preg_match("/^mailto:(.*)/",$found[1][$i],$link)) {
		// *** alors il s'agit d'un lien email
			$href = $link[1];
		} else {
		// *** c'est une adresse web
			$href = $found[1][$i];
		}
		$linktext = $found[2][$i];
		// *** si le texte du lien contient déjà l'adresse ou s'il s'agit d'une
		// *** ancre locale on peut jeter l'adresse.
		if ($linktext == $href || strpos($href,"#") === 0) { $href = "";}
		// *** sinon l'ajouter entre crochets.
		if ($href > "") { $href = "[". trim(str_replace("@", $masque,$href)) ."]";}
		if (preg_match("/\s*\S+[\w_-]@[\w_-]\S+\s*/",$linktext)) {
		// *** attention : détecter précisément une adresse mail pour éviter de
		// *** corrompre des raccourcis comme [<imgXX>->quelquun@nullepart.net]
		// *** où Spip code la première partie dans un format
		// *** comme : @@SPIP_SOURCEPROPRE2@@
			$linktext = trim(str_replace("@", $masque,$linktext)." ".$href);
		} else {
			$linktext = trim($linktext." ".$href);
		}
	$texte = str_replace($found[0][$i], $linktext, $texte);
	}
  } else {
  // *** pour la page à l'écran
	// *** agir seulement sur les emails
	preg_match_all("/[\"\']mailto:([^@\"']*)@([^\"']*)[\"\']/",$texte,$found);
	$total = count($found[0]);
	for($i=0; $i < $total; $i++) {
		// *** extraire les deux parties de l' adresse (avant et après l'arobase)
		// *** et réécrire le lien
		$part1 = $found[1][$i];
		$part2 = $found[2][$i];
		$newstr ='"#" title="' . $part1 . $arobase . $part2 . '" onClick="location.href = dolink(this.title); return false;"';
		$texte = str_replace($found[0][$i], $newstr, $texte);
	}
	// *** si le texte d'un lien contient une adresse email, le remplacer par le texte choisi
	preg_match_all("/>\s*\S+[\w_-]@[\w_-]\S+\s*<\/a/",$texte,$found);
	$total = count($found[0]);
	for($i=0; $i < $total; $i++) {
		$texte = str_replace($found[0][$i],">$affichage</a",$texte);
	}
 }
return $texte;
}
?>

2. Le JavaScript qui recrée le lien
Mettre cette fonction dans un fichier mes_javascripts.js [5] annexe qui sera reliée depuis vos squelettes :

function dolink(ad){
   link = 'mailto:' + ad.replace(/\.\..+t\.\./,"@"); 
   return link;
}

3. L’image de l’arobase (pour version imprimable)
Placer l’image de l’arobase (commat.gif) [6] dans le répertoire /IMG.

4. Squelette « version imprimable »
Créer un couple de fichiers pour le squelette de version imprimable (imprim.php3 et imprim.html). Pour ce qui concerne l’antispam ce squelette n’a besoin de rien en particulier.

5. Dans tes squelettes [7]

-  Dans la partie <head> de ton squelette, mettre la ligne [8] :

 
<script type="text/javascript" src="mes_javascripts.js"></script>

-  Ajouter un lien qui appellera l’article avec le squelette de « version imprimable ». Par exemple :

<a href="imprim.php3?id_article=#ID_ARTICLE" target="_blank" onClick="javascript:window.open('imprim.php3?id_article=#ID_ARTICLE&printver=1', 'print_version', 'scrollbars=yes, resizable=yes, menubar=yes, width=740, height=580'); return false;"><:ver_imprimer:></a>

Note : Cette méthode va attraper presque tous les adresses e-mail : celles résultantes d’un raccourci SPIP, comme celles entrées à la main en HTML [9]. Pour une sécurité plus grande, il est possible d’ajouter le filtre |antispam à toutes les balises qui sont susceptibles de contenir des adresses e-mail, et ceci aussi bien dans le squelette normal que dans le squelette « imprim.html ». Par exemple, [(#TEXTE|antispam)]. Ce filtre inclus dans SPIP transforme toutes les arobases en une série aléatoire de 3 caractères.

Fichiers à télécharger

Dans le fichier ci-joint se trouvent les fichiers avec tout le code noté ci-dessus.

Pour mieux comprendre ou améliorer le système
Regarder les lignes marquées par des commentaires avec trois étoiles *** dans le fichier mes_options.php3 et dans le squelette article.html.

Notes

[1Il s’agit ici des adresses entrées dans le texte des articles. Pour offrir la possibilité d’envoyer un e-mail à l’auteur d’un article, il est de toute façon préférable d’utiliser le formulaire #FORMULAIRE_ECRIRE_AUTEUR.

[2Ce système représente un murissement de la contrib déjà publié en anglais. D’autres contribs, notamment celle-ci ont montré comment crypter la source HTML des adresses e-mail. Des robots spam peuvent maintenant lire un tel cryptage, je pense. C’est pourquoi j’utilise le système présenté ici.

[3La feuille de style impression.css distribuée avec Spip fait également apparaître le lien lorsqu’une page est imprimée, au moyen de l’instruction :

a:after {
     content: " [" attr(href) "]";
}

Le désavantage principal de cette méthode est que Internet Explorer ignore cette instruction CSS. Créer un squelette séparé pour l’impression permet non seulement de contourner ce problème, mais il devient également facile d’ajuster les styles, les polices, la manière dont le texte se comporte par rapport aux images, etc.

[4Le nom de ce fichier et le nom de la fonction sont obligatoirement à laisser tels quels. Pour en savoir plus sur les fonctions qui interviennent à des « points d’entrée » dans le traitement appliqué par SPIP aux textes, voir ce message et aussi cet article (partie « Méthode »).

[5Cela peut être n’importe quel nom de fichier...

[6Ou fais un graphique toi-même de la taille qui te convient. Pour creer l’image de l’arobase on peut utiliser Latex, en tapant <math>$@$</math> (merci à rpapa pour l’idée).

[7Dans cet exemple, seul le squelette article.html a été protégé. Si des adresses e-mail risquent d’être visibles dans d’autre squelettes, il faut penser à faire la même chose dans ces squelettes.

[8Prends soin d’indiquer avec le src= le chemin d’accès à ce fichier dans le cas où il ne se trouve pas dans le même répertoire que le squelette.

[9Pour filtrer les adresses écrites directement en HTML dans un article il est nécessaire d’utiliser une version de SPIP du 7/4/2005 ou ultérieur.

Discussion

13 discussions

  • 1

    Bonjour,

    Est ce que ce plugin va être adapté à spip 2.1 ?
    Et est ce que le code a insérer dans mes_options fonctionne pour spip 2.1 ?

    Merci

    PS : mon but est de pouvoir installer ce plugin sans devoir passer par le couteau suisse

    • Est ce que ce plugin va être adapté à spip 2.1 ?

      Non. En tout cas, pas par moi. J’utilise le Couteau Suisse qui marche mieux et qui est bien maintenu par Pat.

      Et est ce que le code a insérer dans mes_options fonctionne pour spip 2.1 ?

      Je ne pense pas.

    Répondre à ce message

  • 3
    Laurent Mirioni

    Bonjour,

    J’ai chaque mailto derrière une image. Le problème c’est que le « alt » affiche correctement les adresses mail sous IE7, mais sous Firefox (2.0 ou 3.0), le même « alt » s’affiche pour tous, en l’occurrence le premier...
    Ma page est ici : http://www.lpp.fr/spip.php?rubrique6

    • Laurent Mirioni

      Ce n’est pas du « alt » mais du « title » dont je voulais parler, bien sûr.
      J’ai remarqué un comportement similaire sur d’autres sites. Cela semble donc être la faute de Firefox...

    • Laurent Mirioni

      Après divers tests (merci à la communauté Mozilla française), le problème vient du code javascript qui ne semble pas être standard, et qui produit donc des résultats différents à l’exécution.

    • Comme vous voyez en haut de cet article : « (24/09/2007) : Ce sont maintenant deux outils du plugin Couteau Suisse qui reprennent et améliorent le fonctionnement de ce plugin qui est désormais périmé. » je n’ai plus rien fait pour ça depuis longtemps. Moi-même j’utilise le mailcrypt incorporé au Couteau Suisse.

    Répondre à ce message

  • 1

    Pour info le zip de l’article bug avec la 1.9.3 ; pour le telechargement auto

    il demande un repertoire /lib a la racine du site avec les droits en 777 et se telecharge dedans ; donc coté interface plugins on ne peu le voir....

    sinon il est dit : note (10/6/2007) : avec l’aide d’Alexis Roussel ce script a été converti en plugin pour Spip 1.9.x ; il est disponible sur la zone parmi les plugins stables.

    ors le plugin ne se trouve pas coté « stable » mais coté « test » ; donc toujours pareil pour la mise a jour auto nada puisque l’adresse http://files.spip.org/spip-zone/mailcrypt.zip
    n’existe pas.

    Il serait interessant de préciser dans l’article que mailcrypt est une lame du couteau suisse ; d’ailleur je m’en vais l’installer pour voir ...

    @micalement stéphane

    • Il serait interessant de préciser dans l’article que mailcrypt est une lame du couteau suisse

      Maintenant que la fonction pour les pages imprimables a été ajoutée au couteau suisse (voir ici), j’ai ajouté cette mention en tête d’article.

    Répondre à ce message

  • 1

    Je reposte ce que j’ai posté dans le forum du couteau suisse, car je ne sais pas trop quel forum est le plus adapté...

    Bonjour, j’utilise (entre autre) l’outil mailcrypt du couteau suisse.

    J’ai une proposition d’amélioration lorsque on a un lien mail sans texte.

    Imaginons que le mail soit toto@truc.net Au lieu de mettre [Email] comme texte on pourrait mettre : toto<span class="mc_invisible">..</span>@<span class="mc_invisible">..</span>truc.net

    avec évidemment le style span.mc_invisible { display: none; }

    à l’affichage (et à l’impression ;-) ) ça affiche simplement le mail, le lien de type mailto: est toujours géré par le javascript et les robots (d’après http://aspirine.org/cgi-bin/trouvemail.pl ) ne trouvent pas le mail...

    Bref, tout le monde est content !

    Qu’en pensez-vous ?

    Aedrin

    PS : par contre je suis une bique en PHP donc je ne sais pas quoi proposer directement en code....

    • Bonjour, Je ne suis pas sûr que les robots ne sauraient pas lire des adresses comme ça. Dès qu’il il existe un « @ » en texte dans la page le danger de la récuperation de l’adresse est sensiblement plus grand.

      Une solution avec des images se discute (voir ici, mais, pour l’instant je ne la trouve pas très convaincant.

    Répondre à ce message

  • 4

    Bonjour,

    comme cette contrib n’était apparemment pas écrit pour un plugin, si je comprend bien le début de cet article, je ne sais pas qu’est-ce qui est encore nécessaire à l’installation ou qu’est-ce qui diffère...

    J’ai suivi la description en entier et les adresse mails fonctionnent bien.

    Seulement la version imprimable ne fonctionne pas bien, l’image gif n’apparait pas. Dans le code source le src de l’image est vide

    Qu’est-ce qui pourrait être le problème ?

    Merci pour cette contrib et pour vos éventuels réponses.

    Joz

    • Bonsoir, depuis quelque temps cette fonctionnalité est intégré dans le plugin « Couteau Suisse » http://www.spip-contrib.net/Le-Cout....

      Je pense que c’est cette version là qu’il faudrait utilisée désormais.

    • ok, merci.
      Est-ce que j’ai quand même besoin d’ajouter (ou plutôt le laisser puisque je l’ai déjà mis) tout ce qui est décrit ici plus haut (l’entrée dans mes options, le fichier javaScript, l’image @ etc) ou est-ce que tout cela est compris dans le couteau suisse ?

      joz

    • Je crois que tout est intégré dans le couteau. (Je n’ai pas pu l’installer encore par manque de temps.)

    • Est-ce que j’ai quand même besoin d’ajouter (ou plutôt le laisser puisque je l’ai déjà mis) tout ce qui est décrit ici plus haut (l’entrée dans mes options, le fichier javaScript, l’image @ etc) ou est-ce que tout cela est compris dans le couteau suisse ?

      Le couteau suisse comprend le système de filtrage des mails qui marche bien.

      Avec le plugin mailcrypt comme avec le couteau suisse rien à faire d’autre qu’à activer soit la lame du couteau soit le plugin... Ca se fait en deux clics.

      Par contre à ma connaissance le couteau suisse ne propose pas le js d’impression associé, qui moi me semble indispensable. Pour que ça fonctionne il faut que tu penses à mettre la balise (je ne sais plus le nom, c’est expliqué dans le plugin) dans tes squelettes.

    Répondre à ce message

  • 1

    Bonjour,

    J’ai installé le plugin mailcrypt avec spip 1.9.1 mais lorsque je clique sur l’adresse email de la personne à qui je veux écrire (dans un annuaire) il ne se passe rien. Par contre ca fonctionne dans l’espace privé. Y a t il une étape supplémentaire à effectuer après l’installation du plugin ?

    Merci d’avance

    • Bonjour,

      Je ne l’ai jamais utilisé avec 1.9.1 (et c’est pour cela qu’il n’y a pas de mot-clé 1.9.1 à cet article). Il est possible que pour cette version la balise #INSERT_HEAD soit nécessaire dans les squelettes (voir http://www.spip.net/en_article3471.html). Ceci dit, mieux vaut faire une mise à jour vers 1.9.2 qui corrige bcp. de bugs.

      Si cela ne marche pas, éventuellement, donner un URL pour permettre une examination plus concrète.

    Répondre à ce message

  • Dit moi dans un forum on doit toujours donner les points négatifs ???

    Ahhh je suis rassuré.

    Bravo .....Superbe..... Pfffffffff les spam vont me manquer ; nan je rigole.

    Répondre à ce message

  • 2

    Voici une premiere proposition de plugin a tester.

    quelques notes :

    -  le cryptage fonctionne sur 1.9.1 : A tester
    -  la balise #PRINT existe mais ne fait rien (travail necessaire sur le fichier print.php)
    -  les fichiers ne sont pas tres ordonnés
    -  le plugin n’existe pas encore sur http://trac.rezo.net/trac/spip-zone/browser/_plugins_/
    -  Il n’y a pas de licence.. cela sera GPL

    • Magnifique. Merci, Alexis !

      Je regrette ne pas pouvoir spiper en ce moment. Je compte y revenir l’année prochaine !

      Paolo

    • Un autre plugin est à disposition sur spip-contrib :

      Plugin antispam générique

      Merci d’y ajouter vos commentaires et remarques. L’idéal serait de mettre en commun nos ressources pour en faire LE plugin d’antispam.

    Répondre à ce message

  • 1

    bonjour,
    merci de me dire si je peux utiliser cette contrib avec eva 2.0 et spip 1.7.2 mon site est fait avec.

    • Si je ne me trompe pas le point d’entrée « apres_propre » n’existe pas avec Spip 1.7.2. En ce cas cette contrib n’y marchera pas.

    Répondre à ce message

  • Super, merci, fonctionne très bien sur une 1.8.3.

    Répondre à ce message

  • 1

    Bonjour, et merci pour cette contrib tres utile.

    Une question :
    Est il possible (et souhaitable ?) de remplacer les textes de liens contenant une adresse toto@toto.net par une ’fausse adresse’ de type « toto(image gif)toto.net » comme pour l’impresion, plutot que par « [email] » ?

    Et si oui, comment ? (je suis une brel en php, et je n’ai pas bien reussis, en essayant de copier du code depuis la version imprimable...)

    Je crois que ce serait bien pour les queleques utilisateurs ayant désactiver javascript.

    Merci

    Jerome

    • Est il ... souhaitable ?

      Si je me rappelle bien j’avais pensé à cela. Mais comme il s’agit d’un lien, cela devient compliqué lorsqu’on veut faire changer l’apparence du texte « onMouseover ». Il faut alors deux images... En fait, si je ne me trompe pas, il faut du JavaScript. Alors on se retrouve dans la situation de mettre quelque chose pour ceux qui n’ont pas du JavaScript, mais ce quelque chose requiert du JavaScript.

    Répondre à ce message

  • J’ai corrigé le script principal aujourd’hui : Cyril Quemeras m’a fait remarquer que le script mangeait les images des raccourcis comme : [<img41>->http://www.medicalistes.org/].

    Répondre à ce message

  • 3

    Salut,

    Merci pour ce script indispensable.
    Je l’ai installé sur mon site et ça marche impec pour les articles.

    En revanche, les adresses des auteurs de messages dans le forum restent exposées.

    Voir le lien.

    • Oups !

      Le formulaire de ce forum présente une case pour un lien http, mais ce qu’on y met n’apparaît pas.

      Voici le lien : http://www.protestanet.be/sp/article19.html#forum

      Sa-Cha.

    • Oui. Comme j’ai dit dans la contrib, je ne me suis occupé que du texte dans les articles.

      Pour les balises dont le texte ne passe pas par la fonction « propre » de Spip, j’imagine que tu pourrais appeler le script en utilisant un filtre sur une balise.

      Paolo

    • Salut,

      Oui, j’ai bien lu ta restriction, mais je suis incapable d’aller plus loin que de localiser l’endroit où ça se passe.

      C’est ici :

      <div class="forum-titre">[(#TITRE|supprimer_numero)]</div>
      [(#DATE|affdate)][, par <b><A HREF="mailto:#EMAIL">(#NOM)</A></b>]

      Et je ne sais pas par quoi remplacer ce « mailto: » codé en dur dans le squelette.

      Bien à toi.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom