====== Introduction ====== Voilà l'histoire... Vous avez installé votre blog et après quelques semaines, vous recevez plein de spams dans les commentaires! C'est infernal alors vous activez le plugin Akismet: c'est gratuit et ça vous protège contre les spams! C'est le bonheur ?! Bon... Disons qu'on est en 2007 et que le prix Nobel de la paix cette année a été décerné à Al Gore et au GIEC pour leurs travaux sur le réchauffement climatique. Si vous avez vu "Une vérité qui dérange" ("An incovenient truth" en VO), vous vous souvenez surement de la courbe qui monte jusqu'au plafond! Sur le site de Akismet, il y a une courbe qui vous rappellera quelque chose: http://akismet.com/stats/ Si on prend le Spam comme le réchauffement climatique, quelle est la solution d'Akismet ? Vous êtes dans votre voiture et il fait 50°C dehors, et dans votre voiture... c'est infernal! Akismet vous propose d'installer gratuitement dans votre voiture une climatisation. Génial, vous avez une climatisation dans votre voiture et c'est le bonheur ?! Si vous regardez un peu plus loin que votre intérieur de voiture, ce n'est pas vraiment une solution. C'est une simple palliatif. Comment faire pour vraiment réduire le Spam ? ====== Le Spam de WordPress en pratique ====== Wordpress est "Spam Friendly"! Wordpress est une application très simple à installer (5 minutes et hop c'est prêt). Par contre, cet avantage présente aussi un gros défaut: c'est très facile de vous faire spammer! Disons que votre site est http://mon.site.com/ Vous installez WP de manière classique: à la racine. Dans ce cas, l'accès pour ajouter des commentaires se fera par l'URL http://mon.site.com/wp-comments-post.php Mettons nous dans la peau du spammeur: - Le spammeur récupère une liste de sites sous Wordpress (ex: http://mon.site1.com, htpp://mon.site2.com, etc...). C'est très facile avec des moteurs comme blogsearch ou technorati. - Pour chaque site, il suffit d'envoyer un spam sur l'URL http://mon.site1.com/wp-comments-post.php, http://mon.site2.com/wp-comments-post.php C'est aussi simple que ça, et c'est à la portée de n'importe quel programmeur débutant. Et la grande majorité des sites avec WordPress sont installés à la racine! ====== Les Parades et Esquives au Spam ====== Quand il est aussi facile de spammer un site sous Wordpress, tous les spammeurs sont loin d'être des hackeurs professionnels. Il suffit de leur compliquer un peu la vie et on peut se mettre facilement hors de portée des spammeurs. ===== Installer WP dans un sous-répertoire ===== On a vu qu'installer le code WP à la racine de son site est une mauvaise idée. C'est un peu moins facile d'installer WP dans un sous-répertoire, mais ça reste vraiment à la portée de tout le monde. Et la documentation pour le faire est lisible par tout le monde. Bien sûr, le mieux est de le faire dès le début; mais il est aussi possible de déplacer le code WP dans un sous-répertoire même si on a déjà installé le code à la racine. (Référez-vous au sites officiels, les tutoriels sont suffisamment détaillés. En cas de besoin, les forums vous donneront un coup de main!) En pratique, évitez d'appeler le répertoire du code WP avec des noms communs comme /blog/ ou /wordpress/; essayez plutôt vos initiales et votre jour de naissance (/ab25/, /hj56/, etc...), ce sera moins facile à deviner par les spammeurs. Inutile de trop vous compliquer la vie avec le nom de ce répertoire, ça n'arrêtera pas tous les spammeurs! Vous êtes maintenant hors de portée des spammeurs débutants, mais vous continuez à recevoir du spam. Comment est-ce qu'ils font ? ===== Un spam plus ciblé ===== Comme vous voulez que vos visiteurs puissent laisser des commentaires, vous allez leur construire un formulaire HTML sur la page de votre article. Ce formulaire contiendra toutes les informations nécessaires pour qu'ils puissent envoyer un commentaire. C'est normal! Dans ces informations, il y a bien sûr l'URL vers laquelle envoyer le commentaire. Et elle apparaît publiquement.
*
*
Comme vous pouvez le lire, l'URL pour ajouter un commentaire est lisible et contient le nom du répertoire dans lequel vous avez installé WP! Dans cet exemple, le dossier du code PW est /bb07/:
==== Spammer des sites avec le code WP dans un dossier ==== Remettons nous dans la peau du spammeur: - Le spammeur récupère une liste de sites sous Wordpress (ex: http://mon.site1.com, htpp://mon.site2.com, etc...). C'est très facile avec des moteurs comme blogsearch ou technorati. - Pour chaque site, il suffit d'envoyer un spam sur l'URL http://mon.site1.com/wp-comments-post.php, http://mon.site2.com/wp-comments-post.php CA NE MARCHE PAS! Il faut donc ajouter des étapes - Le spammeur récupère une liste de sites sous Wordpress (ex: http://mon.site1.com, htpp://mon.site2.com, etc...). C'est très facile avec des moteurs comme blogsearch ou technorati. - Pour chaque site, il faut récupérer le code HTML de l'article (dans le cache Google ou bien directement sur le site) - Dans le code HTML de l'article, il faut isoler le code - On peut alors envoyer le spam sur la bonne adresse. ex: http://mon.site.com/bb07/wp-comments-post.php Comme on le voit: * Ca demande plus de ressources: il faut lire le contenu de la page et en analyser le contenu * Ca demande plus de temps de traitement: suivant les serveurs et le réseau, le contenu de la page arrive plus ou moins vite Avec une installation de WP à la racine, le spammeur envoyait les spams à toute allure et c'est le réseau internet qui prend en charge la dissémination des spams. Maintenant, il doit recevoir des données et les traiter. Même si techniquement, ce n'est pas difficile à réaliser; il faut quand même une installation plus poussée et plus de ressources. Vous aurez donc moins de spams de ce type. Mais il faut quand même s'en débarrasser! ==== La motivation économique du spam ==== On n'est plus à l'époque des hackeurs qui faisaient du spam pour la gloire! C'est fini le temps où le hackeur se contentait juste d'ajouter sur votre site "HELLO HHH WAS HERE!" pour la gloire (?) Le contenu des spams est purement publicitaire. Il y a donc de l'argent derrière! Les spammeurs sont payés pour envoyer ces messages. Il est alors intéressant de considérer le business du spam pour mieux l'éviter. Il y a un coût à envoyer des spams et une rémunération derrière. Mécaniquement, si le coût devient trop élevé, les spammeurs trouveront une autre activité plus lucrative. Pour WP, on voit que le coût est insignifiant pour spammer la majorité des sites: le spam va donc continuer! ... et Akismet pourra voir ses courbes augmenter !? On en tire un avantage un peu malsain: il suffit de compliquer la vie aux spammeurs pour son propre site et on est à peu près sûr qu'ils laisseront tomber et se contenteront de continuer à spammer facilement les autres sites. ===== Ajouter une clé au formulaire de commentaires ===== On a commencé à personnaliser son site, mais ce n’est pas suffisant. Note: c’est aussi utile d’enlever les références à WP pour montrer le moins possible qu’on utilise une application facile à spammer! * beaucoup de thèmes WP laissent le meta tag donnant la version de WP (soit disant utile pour les statistiques de WP...) * le footer annonce fièrement “powered by wordpress” * les liens avec le nom Blogroll et un lien vers WP * ... On va maintenant ajouter un champ personnalisé au formulaire afin de compliquer la vie aux spammeurs. C’est une étape qui me semblait a priori peu utile, mais qui s’est en pratique montré efficace! ==== Personnaliser le formulaire ==== Techniquement, c'est plutôt simple d'analyser le code HTML pour trouver le champ Ca se complique un peu plus si on ajoute un champ caché ... ... ...
Du côté serveur, il suffit de tester la value de la clé pour bloquer les commentaires qui n'ont pas la bonne clé: if ($_POST['ma_cle_perso']) != "abracadabra_harry_potter_est_la") die(); Apparemment, les spammeurs de WP sont assez paresseux car ce simple ajout bloque énormément de spams! Techniquement, le spammeur sait que wp-comments-post.php doit se trouver dans un chaine de caractères qui commence par action=" et qui contient wp-comments-post.php. C'est donc facile trouver quand on sait ce qu'on cherche! Par contre, si vous ajoutez une clé avec un nom à vous (ex: la_cle_a_bob, le_truc_a_jo, mon_code_a_moi), ça devient plus difficile à trouver quand on ne sait pas à quoi s'attendre! Pour vraiment gérer les cas possibles, il faut alors programmer beaucoup plus de lignes de codes et ça demande donc un niveau technique plus élevé et plus de travail. Economiquement, un spammeur avec un niveau technique plus élevé se fera payer plus cher et le temps perdu à écrire le code pour vous spammer devra être facturé plus cher. Le coût pour vous spammer sera donc élevé! Est-ce que votre site en vaut vraiment la peine ? he, he... ==== Des clés dynamiques ==== Même arrivé jusque là, il vous arrivera encore des spams! On a relevé le niveau, mais ça reste encore à la portée de beaucoup de spammeurs. On va ajouter un coup de cryptage pour faire comprendre aux spammeurs qu'ils perdent leur temps! Pour le moment, la valeur de la clé est toujours la même, par exemple:
... ... ...
Une fois que le spammeur l'a trouvée, il peut s'en servir tout le temps. Pour encore lui compliquer la vie, on va rendre la clé dynamique: * Dans le temps * Dans l'espace Pour un utilisateur humain, l'écriture d'un commentaire passe par les étapes suivantes: - Il demande à votre serveur le formulaire - Il écrit son commentaire et l'envoie Il y a donc une chronologie et un environnement stable (le même ordinateur) Ajoutons ces données à notre clé: TIME_ADRESSE_IP_abracadabra_harry_potter_est_la Par exemple: * il est 10H quand le visiteur affiche le formulaire de commentaires, et son ordinateur a l'adresse IP 12.826.262.98 * ==> le code devra être 10H_12.826.262.98_abracadabra_harry_potter_est_la * il est 14H quand le visiteur affiche le formulaire de commentaires, et son ordinateur a l'adresse IP 45.657.48.89 * ==> le code devra être 14H_45.657.48.89_abracadabra_harry_potter_est_la * il est 22H quand le visiteur affiche le formulaire de commentaires, et son ordinateur a l'adresse IP 878.54.487.11 * ==> le code devra être 22H_878.54.487.11_abracadabra_harry_potter_est_la Du côté serveur, on testera que le commentaire entrant a bien la même adresse IP et un créneau horaire réaliste (par exemple: s'il est 18H, accepter les commentaires entre 16H et 19H) **Ce sont des exemples simples pour dynamiser votre clé, il y a plein d'autres possibilités!** Dans WP, ce concept est déjà très utilisé avec le wp_nonce, dans la partie administration. C'est très étonnant que ce soit aussi peu utilisé dans la partie publique! Enfin, il suffit de crypter votre clé avec un algorithme comme md5 pour rendre illisible la valeur publique de la clé:
... ... ...
Ce qui donnera ce type de code:
... ... ...
Le grand avantage de ce cryptage est qu'il est quasiment impossible de deviner la clé non-cryptée. Par contre, avec la clé non-cryptée, on arrivera toujours au même cryptage. Du côté serveur, ce sera simplement le code: On cache donc la méthode pour créer la clé et la clé va changer dans le temps et suivant l'utilisateur! Si le spammeur arrive à défaire ça, il est capable de deviner votre mot de passe admin et de faire ce qu'il veut avec votre blog. Et encore une fois, avec de telles compétences, il gagnera beaucoup plus d'argent autrement qu'en spammant votre site! ===== Utiliser Javascript ===== Jusqu'à maintenant, on a développé des méthodes surtout pour bloquer les spams. Au final, ce n'est pas mieux que Akismet... Il continue de pleuvoir du spam et on a fait que d'ouvrir un parapluie, on a pas arrêté la pluie! Il faut alors aller plus loin: [[wordpress:anti_spam_plus|anti_spam_plus]] !!