Mes amis les SPAMS de commentaires
- Publié le 26 Janvier 2009
- 10 commentaire(s)
- Catégorie : Technologies Web
Après une légère attaque de SPAMS dans les commentaires de certains billets (gros succès sur le billet des smileys, avec quelques 150 SPAMS en 3 jours...), il m'a fallu désactiver les commentaires quelques jours, le temps de trouver une alternative "rapide" de fabrication. Cela m'a permis de faire le tour des possibilités, sans pour autant toutes les expérimenter...
J'ai pu cependant obtenir un bon compromis, permettant de limiter l'action des SPAMS par une double validation (POST), tout en conservant un site accessible et un bon confort pour les contributeurs par un mécanisme en AJAX.
Mes précédents commentaires
Précédemment, le formulaire d'ajout de commentaires se présentait directement dans la page, avec un jolie effet Mootools de Slide. J'aimais bien le principe, mais j'ai fait preuve de naïveté en me croyant protégé des SPAMS par je ne sais quelle raison mystique !
eZ Publish ne permet pas ce mécanisme de façon native, j'avais donc déployé l'extension Powercontent qui permet de publier directement un objet de contenu à un emplacement donné, sur un seul POST... Un jolie boulevard pour les SPAMS en tout genre qui n'ont eu aucun problème pour combiner les différents types de champs et pour générer des emails et des URL valides.
Les alternatives : Les Captcha
Il est quand même incroyable que l'on soit obligé d'inventer des systèmes aussi complexes, pour lutter contre quelques poignées de pollueurs du Web... Je déteste utiliser les Captcha pour plusieurs raisons, dont le manque d'accessibilité du mécanisme, et surtout le processus très pénible et très dissuasif de concentration visuelle...
Il existe pour les courageux 2 extensions intéressantes pour eZ Publish :
- eZ Human Captcha, extension très configurable et puissante. Voici un exemple sur un site célèbre : http://www.01informatique.fr/newsletter/register
- reCaptcha : Cette extension possède au moins la vertu de rendre utile les nombreux efforts des internautes pour traduire les caractères graphiques. En effet, le projet reCaptcha a pour vocation d'exploiter les milliers de contributions des internautes afin de faire évoluer la capacité des OCR, notamment pour la numérisation de Internet Archives et du New York Times. Pour en savoir plus sur ce projet reCaptcha.
Pour ma part, hors de question d'exploiter un Captcha sur mon Blog.
Les alternatives : La double case à cocher
Cette technique optimiste est apparu depuis quelques temps sur le principe suivant :
- Le formulaire propose une case à cocher visible pour les humaines : "Êtes vous un humaine ?"
- Le formulaire propose une autre case à cocher visible uniquement pour les robots : "Êtes vous un robot ?"
A chaque validation d'un commentaire, le système vérifie que les 2 cases à cocher sont correctement renseignées, à savoir respectivement "Vrai" et "Faux". Tout le système repose sur une hypothèse qui ne fera à mon avis pas long feu, à savoir "Les robots sont idiots et cochent ou décochent tout, sans jamais combiner les possibilités".
Pour ma part, hors de question d'exploiter un système si peu pérenne sur mon Blog.
Les alternatives : La double validation
Cette technique est vieille comme le monde est fonctionne toujours très bien. Il s'agit par ailleurs du mécanisme par défaut sur eZ Publish (peut être un effet de bord positif ?), à savoir :
- Un bouton "Ajouter un commentaire" effectue un premier POST "/content/action" vers la page du formulaire de commentaire
- Le formulaire de commentaire propose un bouton "Valider", qui effectue un deuxième et dernier POST "/content/edit/[...]"
Le mécanisme est un peu complexe, et les robots ne vont visiblement pas aussi loin dans leurs algorithmes. C'est également un peu plus laborieux pour les internautes qui se voient proposer des rafraîchissements de pages. Ce principe est parfois décliné sur un mécanisme de prévisualisation avant publication (ce qui revient au même). Il faut par contre se soucier de la gestion des brouillons pour ne pas polluer sa base de données.
Cette article résume la technique pour eZ Publish : http://www.luxpopuli.fr/eZ-publish/Configuration/eZ-Publish-ajouter-et-configurer-les-commentaires-imbriques
Pour ma part, c'est le mécanisme sur lequel je suis revenu, mais que je souhaite doubler avec un chargement en AJAX
Ma solution : La double validation, complété en AJAX
Après avoir implémenté la double validation classique (par le "/content/action", et le "/content/edit/"), il me fallait absolument doubler le mécanisme par un chargement en AJAX dynamique (toujours avec Mootools), c'est une question d'honneur...
Le mécanisme est le suivant :
- Si JavaScript est désactivé (pour les robots, ou pour les contextes d'accessibilités), la double validation POST se déroule de façon classique
- Si JavaScript est activé, les internautes (à priori pas les robots) se voient proposer le formulaire directement dans la page
Il est difficile de décrire tout le mécanisme, en voici l'essentiel :
Création d'un layout AJAX
eZ Publish ne permet pas de surcharger le "content/edit" avec un paramètre permettant de distinguer une vue AJAX d'une vue classique, il faut donc s'y prendre autrement, par exemple en exploitant le module "layout". Ce module permet de forcer la surcharge du "pagelayout.tpl" par un autre layout, comme par exemple "ajax_pagelayout.tpl". La syntaxe est ensuite la suivante : "/layout/set/ajax/[urlclassique]"
<?php /* #?ini charset="utf-8"? [ajax] PageLayout=ajax_pagelayout.tpl ContentType=text/xml #UseAccessPass=false */ ?>
A noter : La redéfinition d'un Layout réécrit toutes les URL de la sorte : "/layout/set/ajax/[urlclassique]", ce qui est nécessaire pour la navigation AJAX entre les pages, mais problématique pour poster un contenu vers l'URL classique. Le paramètres "UseAccessPass=false" prévu à cet effet ne peut pas être exploité dans le cadre d'un double POST ("/layout/set/ajax/content/action" doit rediriger vers "/layout/set/ajax/content/edit/[...]" et non pas "/content/edit/[...]"). Il faut s'y prendre autrement pour masquer la racine des URLs "/layout/set/ajax/", par exemple en JavaScript (on y reviendra).
Le template "extension/[monextension]/design/[monsiteaccess]/templates/ajax_pagelayout.tpl" :
{if $module_result.ui_context|eq('edit')} {$module_result.content} {/if} <!--<!--DEBUG_REPORT-->-->
Je fais simple pour l'exemple, mais il est conseillé de définir dans un fichier de configuration la liste des conditions de surcharge du "pagelayout.tpl", afin d'éviter les possibilités de navigations alternatives avec un autre layout. Le commentaire sur le DEBUG_REPORT est indispensable si le DEBUG est activé. Sans ce bricolage, le debug contrarie la validité du XML et ne permet pas le chargement AJAX du contenu (très pénible en version de développement).
Chargement en AJAX via Mootools
String.prototype.replaceAll = function(strTarget, strSubString) { var strText = this; var intIndexOfMatch = strText.indexOf( strTarget ); while (intIndexOfMatch != -1) { strText = strText.replace( strTarget, strSubString ) intIndexOfMatch = strText.indexOf( strTarget ); } return( strText ); } /* Comment */ var _COMMENT_FORM_ACTION = 'form_content_action'; var _COMMENT_DIV_ACTION = 'add_comments'; /* Ajax */ var _AJAX_LAYOUT = '/layout/set/ajax'; if ($(_COMMENT_FORM_ACTION)) { var myform = $(_COMMENT_FORM_ACTION); myform.addEvent( 'submit', function(evt) { new Event(evt).stop(); new Request({ method: myform.get('method'), url: _AJAX_LAYOUT+myform.get('action'), onRequest: function() { $(_COMMENT_DIV_ACTION).set('html', '<div id="ajax-loader"><h1>Chargement en cours...</h1><img src='+images_url+'ajax-loader.gif'+'></div>'); }, onSuccess: function(responseText, responseXML) { $(_COMMENT_DIV_ACTION).set('html', responseText.replaceAll(_AJAX_LAYOUT, '')); addCommentEvents(); } }).send(this.toQueryString()); }); }
Ce exemple de code exploite d'autres fonctions et constantes définies par ailleurs (que j'ai tenté de compiler dans cet extrait). Il est cependant suffisamment simple pour ne pas mériter de commentaires, en dehors peut être de quelques subtilités :
- La suppression à la volée de la fameuse racine "/layout/set/ajax/" par simple replaceAll
- La définition de la méthode replaceAll par extension du prototype de l'objet String. En effet, la méthode replace de JavaScript ne remplace que la première occurence de la chaine de caractère cible...
A noter : un site propose la génération de GIF (et pas de PNG, dommage) pour le chargement AJAX : http://www.ajaxload.info/
- Tags :
- SPAM
- AJAX
- eZ Publish
- mootools
Que boire avec ce billet ?
Domaine Rimbert - El Carignator II - Rouge 2004
| Région : | Languedoc |
| Appellation : | Vin de table de France |
| Domaine : | Domaine Rimbert |
| Couleur : | |
| Stock : | 0 |
| Notation : | |
| Prix : | 18 € |
| Commentaire(s) : | 0 Commentaire(s) |
Un vin sans année ! Puisqu'il s'agit d'un assemblage de différents millésimes de carignan, savamment dosés pour orienté la qualité gustative du vin ...
Une fois l'étonnante expérimentation accepté, il reste la dégustation : un vin unique et surprenant, qui laisse un très bon souvenir (comme le propriétaire du domaine).
Akismet
Il y a aussi le workflow Akismet : http://projects.ez.no/akismet/(language)/eng-GB. Ca va aller checker ton commentaire sur Akismet pour vérifier si c'est ou non du SPAM.
Double requête
Salut,
comme je te le disais l'autre soir, la double requête est un anti spam très efficace, en 2 et demi j'ai pas souvenir d'avoir eu un seul spam "automatique" et pour moi c'est bien moins pénible qu'un captcha (surtout si le site répond rapidement). Après c'est sûr que la petite touche d'ajax apporte un confort d'utilisation intéressant.
Et depuis la refonte de mon site, j'utilise une vue dédiée [1] pour la création des objets commentaires histoire d'alléger le processus de création (pas de création de brouillon intermédiaire, pas besoin du paramètre UseCurrent, pas de passage dans l'horrible content/edit...).
Sinon dernière remarque, l'affichage par ordre chronologique des commentaire sous tes posts faciliterait le suivi des éventuels discussions...
[1] http://trac.pwet.fr/browser/trunk...nsion/pwet2/modules/comments/add.php
organisation des commentaires
concernant les commentaires, j'ai vu un système ou on a le choix entre :
- répondre à un commentaire et donc il s'affiche en dessous et collé au commentaire principal
- poster un nouveau commentaire
il y a donc un petit bouton de commentaire en face de chaque commentaire
et je trouvais ça pas mal pour organiser la lecture, après savoir comment c fait derrière c pas mon problème ![]()
spams commentaires
euh ?
ça ressemble à quoi des spams de commentaires ??
Commentaires des commentaires
LLaumgui :
Je suis pas très fan de ces systèmes décentralisés, mais ca fait effectivement partie des alternatives, si toutefois celle de la double validation n'est pas envisageable.
Damien :
On est d'accord sur la double validation et les vilains Captcha ![]()
Pour la création d'un module plutôt qu'un vieux "/content/edit/", c'est sans contexte plus efficace et plus flexible, mais ma stratégie reste plutôt d'exploiter au mieux les mécanismes natifs d'eZ, et en quelques sorte d'écrire le moins de code possible pour atteindre le meilleur résultat possible, et cela pour 2 raisons :
- Difficile de laisser le site sans commentaires, il fallait agir ! (on expérimentera plus tard)
- Difficile de faire la promotion de l'outil si les mécanismes natifs sont contournés, même si je partage souvent ton point de vue sur les défauts de ce magnifique outil
Fonfec et Damien :
J'ai changé l'ordre d'affichage... j'aimais bien dans l'autre sens, ca faisait un peu "casquette à l'envers"... Dommage
Pour l'imbrication de commentaire, je suis pas trop fan, je préfère l'empilement (et je vais peut être ajouter une numérotation pour faciliter la lecture)
Isa :
Un exemple de blog spammé, avec un billet très intéressant sur les scarabées géants : http://olivier.lahaye1.free.fr/do...ndex.php/2006/06/14/47-scarabe-geant
EzPublish et Ajax
Merci pour le tips
En fait je trouve ca assez compliquer pour quelque chose d'aussi simple. De plus le /layout/set/ajax me laisse perplexe. C'est la technique que propose Ez par défaut pour par exemple utiliser un autre layout pour le print. Mais en fait ca entraine pas mal de problème car Ez va concerver cette partie de l'url tous le temps. Donc comme tu l'as fait remarquer il faut ajouter un bout de code javascript pour gérer ce /layout/set
De plus ca laisse une possibilité à l'utilisateur pour "choisir" son layout, ce que je trouve dommageable.
A mon humble avis la proposition de Damien, ie. faire son propre module de publication de commentaire est plus saint (plus à ce soucier des pb de drafts, par exemple)
En tous cas merci c'est très instructif
eZ Publish et AJAX - diverses méthodes
Il existe de nombreuses méthodes pour atteindre son objectif. Dans mon cas, pour les commentaires, je pense que c'est la méthode la plus rapide à mettre en place (elle m'a demandé moins de 2 heures, le plus long étant les contrôles JS et autres debug). Par contre selon le besoin, elle est effectivement inadapté, et j'en conviens, il faudrait faire une pétition pour demander à eZ Systems de revoir son mécanisme de /content/action et content/edit
A savoir :
- Pour ne pas se trainer le /layout/set, utiliser le paramètre : UseAccessPass=false
- Pour exploiter des vues AJAX de type node/view/*.tpl, les overrides classiques fonctionnent très bien (pas que pour AJAX d'ailleurs mais pour des vues XML en général, dont par exemple des RSS ou des Google Sitemap), par exemple : http://www.gandbox.fr/rss2/(tag)/ez%20publish
- Pour exploiter des vues AJAX pour des formulaires de saisie, et de façon plus massive, je suis d'accord que tôt ou tard, on en vient à la création de son module.
Ajax et Workflow
C'est vrai qu'un module kernel ajax ne ferai pas de mal. Mais c'est encore pire si tu veux faire un workflow de validation pour les commentaires.
Je pense qu'avant d'ajouter des fonctionnalités, EzSystem devrai d'abord revoir pas mal de fonctionnalités de base
* Le Modèle MVC est assez bizarre vue qu'une partie du controller est dans la template (la partie V)
* Les workflow sont dramatiques
* La boutique est vraiment lourde par rapport aux fonctionnalités proposés
* Le mécanisme de forum fourni de base est assez mauvais. Trop simpliste. Aucune modération prévu de base etc...
* La gestion des multimédia est assez lourde
* ezOE est juste abominable
* Le back-office est très touffu
* Les templates de datatypes ne sont pas conforme xhtml
* Les performances, loin d'être ébourifantes
* L'intégration avec des services tiers est toujours assez lourd IMHO
enfin je pourrai continuer longtemps ^_^
<fin du mode rant/>
Inventaire des défauts d'eZ Publish
Inventaire intéressant et classique des défauts d'eZ Publish. Difficile de répondre point par point dans un commentaire, ca sera l'objet d'un futur billet
Ez et GandBoxS
Ca serai assez intéressant d'avoir ton point de vu éclairé ^_^
