Je ne sais pas ce qu’il en est de votre coté, mais je reçois périodiquement des vagues de spams écrits en Russe ou en Chinois sur les formulaires de contact de mes différents sites internet. Voici une idée comme une autre pour s’en débarrasser.
L’approche à adopter contre le spam de formulaires web
Il y a quelques mois j’avais publié une méthode basée sur xt_geoip et des règles iptables pour interdire le trafic avec des adresses IP ciblées par pays (Chine, Russie, …). Cette approche est intéressante mais elle ne me satisfait pas entièrement car elle est assez radicale et peut engendrer des coupures abusives comme par exemple pour des expatriés Français en Russie qui voudraient surfer sur votre site ou communiquer avec vous.
Il existe aussi les méthodes basées sur des Captcha qui fonctionnent mais qui décalent le problème : elles servent à éviter les envois par des robots automatiques, mais autorisent les internautes à vous écrire en Russe. De plus elles embêtent tout le monde alors qu’on ne veut viser que les alphabets différents du nôtre. Et quand ces Captchas utilisent les technologies de machine learning de Google, je m’abstiens.
Non, la solution est à mon avis plus simple. Il y a des messages qu’on devrait pouvoir marquer comme spam avant même qu’ils ne soient envoyés, comme par exemple les messages écrits dans un alphabet différent du nôtre pourvu que nous n’ayons aucune intention de communiquer avec le monde entier. Pour moi, un message écrit en Russe ou en Chinois, c’est directement poubelle.
Implémentation avec Prestashop 1.6
Il suffit de modifier le contrôleur derrière le formulaire de contact pour ajouter un test sur le corps de message : s’il contient des caractères cyrilliques c’est « erreur ».
La marche à suivre ressemble pas mal à ce tuto sur arnaud-merigeau.fr.
- Rendez-vous dans /override/controllers/front
- Créez ContactController.php (fichier enfant de /controllers/front/ContactController.php qui contient la classe parente)
- Ajoutez-y le code suivant
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class ContactController extends ContactControllerCore { function isRussian($str) { return preg_match('/[А-Яа-яЁё]/u', $str); } /** * Start forms process * @see FrontController::postProcess() */ public function postProcess() { [...] } |
Vous l’aurez reconnu, le contenu de la fonction postProcess() est copié-collé depuis le fichier parent cité ci-dessus.
La modification à apporter sur cette fonction est la suivante :
1 2 3 4 5 6 7 8 9 10 |
if (!($from = trim(Tools::getValue('from'))) || !Validate::isEmail($from)) { $this->errors[] = Tools::displayError('Invalid email address.'); } elseif (!$message) { $this->errors[] = Tools::displayError('The message cannot be blank.'); } elseif (!Validate::isCleanHtml($message)) { $this->errors[] = Tools::displayError('Invalid message'); } elseif ($this->isRussian($message)) { // La modification est ici $this->errors[] = Tools::displayError('Russian is forbidden here'); } |
Il faudra préalablement créer la fonction isRussian. Si vous voulez varier un peu les plaisirs concernant cette fonction isRussian ça se passe ici sur stackoverflow.com.
1 2 3 |
function isRussian($str) { return preg_match('/[А-Яа-яЁё]/u', $str); } |
Vous vous demandez à quoi isChinese() pourrait bien ressembler ? A ceci :
1 2 3 |
function isChinese($str) { return preg_match('/\p{Han}+/u', $str); } |
Les plus perfectionnistes d’entre nous devront ajouter la traduction qui va bien pour la chaîne rajoutée en anglais.
Implémentation avec WordPress 5
Modération des commentaires
Avec Akismet
Sur WordPress le module Akismet développé par l’entreprise mère de WordPress, Automattic, n’est pas si mal pour filtrer les commentaires. Mais il ne filtre pas tout et repose sur un service hébergé et géré ailleurs.
Dans l’idéal ce module devrait proposer un switch « Forbid Russian », ce serait plus efficace et moins coûteux en traitement machine.
Je n’ai pas encore créé de tel module mais si vous vous y mettez, n’hésitez pas à m’en faire part 🙂
Sans module, dans Réglages > Discussion
Insérer quelques caractères russes qui n’ont pas leur équivalent dans l’alphabet latin dans l’espace Liste noire pour les commentaires : Lorsqu’un commentaire contient l’un de ces mots dans son contenu, son nom, son URL, son adresse de messagerie, ou son adresse IP, il sera mis à la corbeille. Un seul mot ou une seule adresse IP par ligne […].
Cela devrait suffire à placer les commentaires Russes directement à la corbeille. Une amélioration consisterait à complètement interdire de soumettre du Russe.
Modération du formulaire de contact
Si vous utilisez le thème Divi et le compostant de formulaire de contact associé, vous pouvez customiser le code pour inclure un filtre anti-cyrilique ou anti-han (Chinois).
Une méthode est proposée ici pour outrepasser une classe du thème, en l’occurrence la classe ET_Builder_Module_Contact_Form.
Récapitulatif :
- Création du dossier /wp-content/themes/child-theme/custom-modules
- Création du fichier custom-contact.php dans ce dossier
- Copier-coller du fichier /wp-content/themes/Divi/includes/builder/module/ContactForm.php dans ce fichier nouvellement créé (sans la première ligne qui sera class Custom_ET_Builder_Module_Contact_Form extends ET_Builder_Module {
- Modification de functions.php du thème enfant comme ceci :
1 2 3 4 5 6 7 8 9 10 11 |
function divi_child_theme_setup() { if ( ! class_exists('ET_Builder_Module') ) { return; } get_template_part( 'custom-modules/custom-contact' ); $cfwpm = new Custom_ET_Builder_Module_Contact_Form; remove_shortcode( 'et_pb_contact_form' ); add_shortcode( 'et_pb_contact_form', array($cfwpm, '_shortcode_callback') ); } add_action( 'wp', 'divi_child_theme_setup', 9999 ); |
Chez moi cette méthode fonctionne pour customiser shortcode et_pb_contact_form et la classe sous-jacente dans le thème enfant. Mais un effet de bord apparait : la redirection vers une URL après envoi ne fonctionne plus, et l’affichage du message de succès d’envoi de message ne fonctionne également plus.
Pour finir, il faudra implémenter le fameux test avec l’expression régulière qui refuse les classes de caractères non voulues.
Implémentation avec Exim
Jusqu’à présent je n’ai traité que le cas des formulaires web mais pourquoi ne pas configurer votre serveur de mail pour interdire l’émission d’emails en cyrilliques, ou encore interdire la délivrance d’emails en cyrillique ?
Cela est tout à fait jouable mais je ne m’y suis pas encore mis.
Conclusion
L’approche décrite dans cet article consiste à détecter l’alphabet cyrilique et à prendre des mesures en conséquence. Cela a l’avantage d’être simple et efficace. Néanmoins je recommande de croiser cette méthode avec d’autres approches, comme notamment la désactivation du protocole HTTP/1.0 au moins sur les pages de formulaires car les bots spammeurs utilisent encore ce protocole inusité.