Fini le spam sur le formulaire de contact PrestaShop, grâce à une astuce simple (ép. 131)

Vous avez aussi reçu beaucoup de spam via le formulaire de contact PrestaShop ? C’est énervant, ces robots n’ont que ça en tête vous inonder de message et par la même occasion casser la réputation de votre domaine. Corrigeons cela avec un bout de code !

Le spam sur PrestaShop c’est grave ? Faut-il faire attention ?

Tout d’abord, il est désagréable de recevoir des mails en boucle de robots avec un contenu incompréhensible. Cela vous fait perdre du temps et vous inonde de mails (parfois le spam se déroule par période).

Les messages de spam vont remplir votre PrestaShop de données obsolètes, notamment dans le SAV. Il n’est pas bon de stocker dans sa base de données des données douteuses, on ne sait jamais ce qui pourrait se passer si tout à coup l’un de ces liens était par « mégarde » exécuté.

De plus, si votre formulaire de contact envoie une copie du mail au client, cela veut dire que votre boutique PrestaShop va relayer du spam pour les pirates. Ils se servent de vous pour envoyer des mails malveillants, grâce à la confirmation du message client (ce qui va nuire à la réputation de votre domaine).

En général j’utilise reCatpcha de Google pour sécuriser

C’est ce que je fais habituellement sur PrestaShop, j’utilise le module reCatpcha qui est bien pratique, mais cela présente aussi des inconvénients. Personnellement je me dis qu’il serait bien de pouvoir se passer d’un module pour sécuriser ce genre de type de page connu pour des problèmes récurrents liés au spam (il faudrait idéalement une sécurité native intégrée).

Le 1er problème d’utiliser Google reCatpcha c’est qu’il faut se connecter à Google avec une API et donc charger des fichiers JavaScript supplémentaires qui vont ralentir votre boutique PrestaShop (voir comment rendre rapide PrestaShop). L’intégration n’est pas forcément 100% transparente pour le client qui doit cocher « Je ne suis pas un robot »… (la nouvelle version V3 semble travailler en arrière-plan directement).

Comprendre le vilain spam, pour mieux le bloquer

Pour bloquer le spam, il faut se poser les bonnes questions et analyser les messages qui sont relayés. Dans tous les cas de message spam, j’ai constaté qu’il y avait soit une url de site web ou du code HTML.

En partant de ce principe la règle est assez simple, il faut simplement bloquer les messages soumis par le formulaire de contact et qui intègrent un lien ou du HTML. (voir aussi ce billet : comment optimiser le rendu du formulaire de contact PrestaShop).

L’idéale serait d’avoir en « natif » dans la configuration du module de contact PrestaShop une option de ce type « Bloquer le HTML », « Bloquer les liens »… cela nécessite peu de code et c’est diaboliquement efficace.

Et les clients qui veulent envoyer des liens et du HTML ?

En fait dans les cas de spam sur PrestaShop j’ai été voir les messages des clients « réels » stockés en base de données et le verdict est assez clair.

Les clients « normaux » ne postent jamais de HTML dans leur message et très rarement des liens. S’ils veulent parler d’un produit, ils ne font pas le lien vers la page, mais vont donner par exemple une référence ou nom du produit.

En partant de ce principe, on peut dire que les clients dans la plupart des cas n’ont pas besoin d’utiliser de liens ou de code HTML dans le message, donc autant bloquer cette possibilité pour se préserver du spam.

Les solutions populaires anti-spam sont souvent détournées

Aussi incroyable que ça puisse paraitre, mais je trouve que souvent les sécurités anti-spam sont souvent « moyennement » efficaces et vous savez pourquoi ? Parce que les pirates sont souvent plus rapides que ceux qui créent le système de sécurité.

Combien de fois j’ai installé des systèmes de captcha « populaires » qui laissaient quand même passer du spam… (fiou). Et vous savez pourquoi ? Parce ces systèmes utilisent toujours les mêmes principes et par la force du temps les robots sont capables de les décrypter.

Sur King-Avis via le formulaire de contact j’ai mis en place un captcha maison. Le robot doit trouver le code en orange et la couleur est injectée en CSS la technique est redoutable zéro spam (un concept intéressant à transposer sur PrestaShop un jour qui sait…).

Pour ce tutoriel Prestashop vous avez à disposition :

  • 1 x contactform.php (formulaire de contact sécurisé)

Télécharger

Résumé de la vidéo : Sécuriser la page de contact PrestaShop du spam

  • On regarde d’abord les options du module en back-office PrestaShop, on active la notification pour le marchand, mais on retire le mail de confirmation pour le client (se prémunir d’être un relai de spam).
  • Ensuite, on teste la soumission du formulaire pour voir comment celui-ci réagit. On peut consulter le résultat du stockage en back-office via l’onglet du SAV avec le détail du message.
  • Puis, on va modifier la méthode « sendMessage » du fichier « contactform.php » en ajoutant le contrôle sur le HTML et les liens. Le blocage est instantané et les injections en base de données ne peuvent plus avoir lieu. Vous êtes à présent protégé du spam.

BOUM !

1 seul mail par semaine - pas de publicité

35 commentaires sur “Fini le spam sur le formulaire de contact PrestaShop, grâce à une astuce simple (ép. 131)”

  1. Mais c’est trop bien! Merci Germain!
    J’ai refusé dès le début de mettre le captcha car c’est encore et encore une étape de contrôle de quelque chose pour faire une truc basique, envoyer un message dans notre cas. J’ai des spammeurs qui se sont installé sur mon formulaire avec un message par semaine qui ne vient pas d’un client mais d’un spammeur, trop peu pour me décidé a mettre du captcha mais trop pour que se soit acceptable.
    Code court, efficace, simple, et franchement utile.
    Je viens de checker et tout les courriels indésirable ont dans leur message un « https » ou un « www ».
    Mon SAV va être plus propre, et sans soumettre mes clients au captcha.

  2. Bonjour et MERCI Germain !
    Ca fait un bon moment que je te suis maintenant et j’ai pris pas mal de tes bouts de codes.
    C’est souvent simple et efficace, Top !
    C’est en place et ca fonctionne parfaitement. 15minutes et c’est réglé.
    Je confirme que tous message spams ont un lien…
    Ca donne envie de te filer les clé de la boutique pour mettre tous ca au propre, mais en attendant c’est de la débrouille avec tes tutos, et ca fonctionne !
    Merci encore.
    Sept7.fr

  3. Salut,
    le point négatif de cette méthode est si un client pose une question sur un article en indiquant l’url de la fiche article concerné au travers du formulaire de contact, celui-ci sera bloqué.

    1. Hello,

      C’est exact, mais le client verra l’erreur et statistiquement il y a peu de clients qui postent un lien.

      C’est un choix assez « tranché », mais qui permet de résoudre définitivement le SPAM sur PrestaShop.

      A bientôt !

  4. Merci beaucoup pour ces astuces!
    J’aimerai également utiliser ceci pour mon site en version 1.6 mais je trouve pas comment supprimer l’email de confirmation au client et le bon endroit pour indiquer les contrôles sur le HTML et les liens. Avez-vous deja effectué ceci sur les version 1.6 ?
    Cordialement

  5. Bonjour!

    Les Captchas peuvent être « contournés » en utilisant des auto-solvers (en clair, un mec va farmer des captchas pour vous en échange des quelques centimes) reliés à un robot qui va spammer en continu…

    Tout dépend donc de la taille du site, je doute que ces spammeurs s’amusent à payer ce genre de service pour embêter un petit site…

    Sur Prestashop 1.6, il était possible de se voir « blackmailé » son adresse email avec l’option « Envoyer à un ami » des fiches produit. Le risque du formulaire de contact est le même : Si votre site envoie un email de confirmation automatique à une adresse invalide, à force, il peut se faire blacklister…

  6. Merci, c’est super, même si je ne suis pas sujet au spam, pour le moment.
    Je confirme que le captcha de Google est une plaie. Il m’est arrivé de cliquer des dizaines de fois (sans exagération) avant que mon message soit accepté. Finalement, bien souvent, je ne laisse plus de message quand je vois un captcha.
    Par contre, j’ai suivi les instructions pour la traduction, mais ça ne marche pas, le texte est toujours en français, quelque soit la langue. Du coup, j’y ai mis en anglais dans le code, mais c’est dommage.

  7. Très bon tuto comme toujours. J’ai juste un petit problème de traduction. La traduction s’affiche dans Modules >>> Contactform >>> Shop ModulesContactformShop-ModulesContactformShop au lieu de ModulesContactformShop et n’apparaît dans aucun fichier app >>> >>> Resources >>> translation
    Encore merci pour vos tutos. Bonne continuation.

  8. Bonjour, merci pour ce Tuto , et l’ensemble de vos competences
    Cela fonctionne t il avec un PrestaShop 1.6 ?
    Merci encore

  9. Bonjour,

    // 01.09.21 – Webbax | TUTO 131 – bloquer le SPAM sévèrement
    } elseif(strpos($message,'href')!==false || strpos($_POST['message'],'http')!==false|| strpos($_POST['message'],'.com')!==false || strpos($_POST['message'],'.fr')!==false || strpos($_POST['message'],'@')!==false || strpos($_POST['message'],'www')!==false){
    
    if(strpos($message,'href')!==false){
    $this->context->controller->errors[] = $this->l('Le HTML n\'est pas autorisé dans le message');
    }
    if(strpos($_POST['message'],'http')!==false || strpos($_POST['message'],'.com')!==false || strpos($_POST['message'],'.fr')!==false || strpos($_POST['message'],'@')!==false || strpos($_POST['message'],'www')!==false){
    $this->context->controller->errors[] = $this->l('Les liens et les adresses mails ne sont pas autorisés dans le message');
    }
    // —
    

    voici le code amélioré pour bloquer les @, les .fr, les .com

    Encore merci Germain pour toutes tes astuces.

  10. Merci Germain !!
    Ma boutique est plus efficace grace à tes tutoriels.
    Je viens de suivre ton tuto pour vider les 7 tables inutiles qui spam la bdd avec la modif du fichier IndexController.php, ma bdd est passé de 220mo à 50mo :))
    Et maintenant fini les « EricJones » et autre conseiller en SEO qui demande de cliquer sur leur liens.
    Franchement tu es un bon, ça me fait plaisir de suivre tes tutos!
    Bonne journée à toi!

  11. Bonjour et merci beaucoup Germain.
    Pour moi, si tu le permets, ce serait une question :
    Est-ce que les messages au SAV dans la BDD sont liés à d’autres données ?
    Ou puis-je les supprimer directement à l’aide d’un petit module maison…
    Merci d’avance.

  12. Bonjour, je suis sur PS 1.7.8.10 et les elseif ont été transformé en if tout court. Est ce qu’on fait pareil on modifier les elseif du tutoriel en if ?
    Ca va pas bugger ?
    Merci par avance.

      1. Avant, il y avait bien des } elseif ( à la chaîne dans le contactform.php
        Dans les nouvelles version, ils ont remplacé ça par des
        if(test){
        traitement;
        return;
        }

        Pour les nouvelles version du contactform, il suffit donc de remplacer le elseif par un if et ajouter un return; avant la fermeture du if (avant le } qui ferme le if).

  13. Bonjour
    Merci pour ce tutoriel très intéressant.
    Ceci ne résout qu’une partie du problème en ce qui me concerne.
    Je suis aussi inondé de Spams dont le contenu ne contient qu’une suite de caractères. Il me semble qu’on est alors obligé de passer par un système de vérification du type google ?

    1. Oui, le mieux est d’utiliser un module Google PrestaShop du type « reCaptcha » qui sécurise ce processus. De plus il existe une option « invisible » ce qui permet de ne pas déranger l’internaute / encombrer l’interface.

  14. Bonjour,
    Merci tout marche à la merveille, en cas de mise à jour ont perd les modifications.
    J’ai ajouté un champs téléphone, mais je n’arrive pas à le trouver dans le backoffice->SAV
    Comment ajouter ce champ, il ne faut pas compliquer car il ya une base de données, ya il un moyen de le concatiner avec le MESSAGE lors de l’envois/enregistrment dans la base de données.
    voici mon formulaire : https://www.biomedica.tn/fr/contact

  15. Mais tellement merci Webbax !

    Je subissait du spam de @ registry . godaddy, c’était 500 à 1000 messages par jours…
    J’ai mis ton code et… Terminado!

    Pour répondre au commentaire au dessus à propos des elseif à la place des if, faut rien changer faut juste mettre le fichier de webbax à la place de celui d’origine (après l’avoir sauvegardé)

    J’ai rajouté:

    (strpos($message,'href')!==false
    || strpos($_POST['message'],'SEO')!==false
    || strpos($_POST['message'],'seo')!==false
    || strpos($_POST['message'],'traffic')!==false
    || strpos($_POST['message'],'http')!==false
    || strpos($_POST['message'],'https')!==false
    || strpos($_POST['message'],'Best regards')!==false
    || strpos($_POST['message'],'Best regard')!==false
    || strpos($_POST['message'],'website')!==false
    || strpos($_POST['message'],'@')!==false
    || strpos($_POST['message'],'$')!==false
    || strpos($_POST['message'],'SMS')!==false
    || strpos($_POST['message'],'sms')!==false
    || strpos($_POST['message'],'//')!==false
    || strpos($_POST['message'],'Ndewo, achọrọ m ịmara ọnụahịa gị.')!==false
    || strpos($_POST['message'],'Sveiki, es gribēju zināt savu cenu.')!==false
    || strpos($_POST['message'],'Kaixo, zure prezioa jakin nahi nuen.')!==false
    || strpos($_POST['message'],'Hai, saya ingin tahu harga Anda.')!==false
    || strpos($_POST['message'],'Szia, meg akartam tudni az árát.')!==false
    || strpos($_POST['message'],'Sveiki, aš norėjau sužinoti jūsų kainą.')!==false
    || strpos($_POST['message'],'Hæ, ég vildi vita verð þitt.')!==false
    || strpos($_POST['message'],'Hi, ego volo scire vestri pretium.')!==false
    || strpos($_POST['message'],'Ողջույն, ես ուզում էի իմանալ ձեր գինը.')!==false
    || strpos($_POST['message'],'Salam, qiymətinizi bilmək istədim.')!==false
    || strpos($_POST['message'],'Hola, volia saber el seu preu.')!==false
    || strpos($_POST['message'],'Aloha, makemake wau eʻike i kāu kumukūʻai.')!==false
    || strpos($_POST['message'],'Γεια σου, ήθελα να μάθω την τιμή σας.')!==false
    || strpos($_POST['message'],'Ciao, volevo sapere il tuo prezzo.')!==false
    || strpos($_POST['message'],'Salut, ech wollt Äre Präis wëssen.')!==false
    || strpos($_POST['message'],'Dia duit, theastaigh uaim do phraghas a fháil.')!==false
    || strpos($_POST['message'],'Hi, roeddwn i eisiau gwybod eich pris.')!==false
    || strpos($_POST['message'],'Xin chào, tôi muốn biết giá của bạn.')!==false
    || strpos($_POST['message'],'Hi, I wanted to know your price.')!==false
    || strpos($_POST['message'],'Hallo, ek wou jou prys ken.')!==false
    || strpos($_POST['message'],'Hola, quería saber tu precio..')!==false
    || strpos($_POST['message'],'Ola, quería saber o seu prezo.')!==false
    || strpos($_POST['message'],'Hi, მინდოდა ვიცოდე თქვენი ფასი.')!==false
    || strpos($_POST['message'],'Sawubona, bengifuna ukwazi intengo yakho.')!==false
    || strpos($_POST['message'],'Здравейте, исках да знам цената ви.')!==false
    || strpos($_POST['message'],'Zdravo, htio sam znati vašu cijenu.')!==false
    || strpos($_POST['message'],'Hej, jeg ønskede at kende din pris.')!==false
    || strpos($_POST['message'],'Прывітанне, я хацеў даведацца Ваш прайс.')!==false
    || strpos($_POST['message'],'Hi, kam dashur të di çmimin tuaj')!==false
    || strpos($_POST['message'],'হাই, আমি আপনার মূল্য জানতে চেয়েছিলাম.')!==false
    || strpos($_POST['message'],'www.')!==false)
    
  16. Bonjour Odanimret bien vu tes modifs et merci à Webbax pour toutes tes astuces toujours très précieuses !

    J’utilise ce tips depuis des mois mais malheureusement nous faisons face à une véritable capable de spam en ce moment avec les mots clefs que tu as cité au dessus. Malgré l’utilisation de Captcha, rien n’y fait.

    Serait-il possible de mettre à jour le fichier contactform ou donner directement les modifications à réaliser sur le fichier ?

  17. Merci à Odanimret pour sa liste exhaustive.

    Voici la modification du contactform.php que j’ai effectuée sur la version 4.4.2 du contacform qui utilise des if / return au lieu des elseif

    Comme vous pouvez le voir, on peut commenter des lignes si on ne veut pas exclure les liens dans les mails (comme demandé par quelqu’un plus haut).

    // 01.03.24 - Webbax | TUTO 131 - bloquer le SPAM sévèrement, pour le contactform 4.4.2 (et adapté par Rénato)
    if (strpos($message,'href')!==false
    	|| strpos($_POST['message'],'SEO')!==false
    	|| strpos($_POST['message'],'seo')!==false
    	|| strpos($_POST['message'],'traffic')!==false
    	//|| strpos($_POST['message'],'http')!==false
    	//|| strpos($_POST['message'],'https')!==false
    	//|| strpos($_POST['message'],'Best regards')!==false
    	//|| strpos($_POST['message'],'Best regard')!==false
    	//|| strpos($_POST['message'],'website')!==false
    	//|| strpos($_POST['message'],'@')!==false
    	|| strpos($_POST['message'],'$')!==false
    	|| strpos($_POST['message'],'SMS')!==false
    	|| strpos($_POST['message'],'sms')!==false
    	//|| strpos($_POST['message'],'//')!==false
    	|| strpos($_POST['message'],'Ndewo, ach?r? m ?mara ?n?ah?a g?.')!==false
    	|| strpos($_POST['message'],'Sveiki, es gribeju zinat savu cenu.')!==false
    	|| strpos($_POST['message'],'Kaixo, zure prezioa jakin nahi nuen.')!==false
    	|| strpos($_POST['message'],'Hai, saya ingin tahu harga Anda.')!==false
    	|| strpos($_POST['message'],'Szia, meg akartam tudni az Სt.')!==false
    	|| strpos($_POST['message'],'Sveiki, aš norejau sužinoti jusu kaina.')!==false
    	|| strpos($_POST['message'],'H欠駠vildi vita ver𠾩tt.')!==false
    	|| strpos($_POST['message'],'Hi, ego volo scire vestri pretium.')!==false
    	|| strpos($_POST['message'],'???????, ?? ?????? ?? ?????? ??? ????.')!==false
    	|| strpos($_POST['message'],'Salam, qiym?tinizi bilm?k ist?dim.')!==false
    	|| strpos($_POST['message'],'Hola, volia saber el seu preu.')!==false
    	|| strpos($_POST['message'],'Aloha, makemake wau e?ike i kau kumuku?ai.')!==false
    	|| strpos($_POST['message'],'Ge?a s??, ??e?a ?a µ??? t?? t?µ? sa?.')!==false
    	|| strpos($_POST['message'],'Ciao, volevo sapere il tuo prezzo.')!==false
    	|| strpos($_POST['message'],'Salut, ech wollt IJe Pr䩳 w볳en.')!==false
    	|| strpos($_POST['message'],'Dia duit, theastaigh uaim do phraghas a fhᩬ.')!==false
    	|| strpos($_POST['message'],'Hi, roeddwn i eisiau gwybod eich pris.')!==false
    	|| strpos($_POST['message'],'Xin ch௬ t  u?n bi?t giᠣ?a b?n.')!==false
    	|| strpos($_POST['message'],'Hi, I wanted to know your price.')!==false
    	|| strpos($_POST['message'],'Hallo, ek wou jou prys ken.')!==false
    	|| strpos($_POST['message'],'Hola, quer saber tu precio..')!==false
    	|| strpos($_POST['message'],'Ola, quer saber o seu prezo.')!==false
    	|| strpos($_POST['message'],'Hi, ??????? ?????? ?????? ????.')!==false
    	|| strpos($_POST['message'],'Sawubona, bengifuna ukwazi intengo yakho.')!==false
    	|| strpos($_POST['message'],'?????????, ????? ?? ???? ?????? ??.')!==false
    	|| strpos($_POST['message'],'Zdravo, htio sam znati vašu cijenu.')!==false
    	|| strpos($_POST['message'],'Hej, jeg ønskede at kende din pris.')!==false
    	|| strpos($_POST['message'],'??????????, ? ????? ????????? ??? ?????.')!==false
    	|| strpos($_POST['message'],'Hi, kam dashur t려i 筩min tuaj')!==false
    	|| strpos($_POST['message'],'???, ??? ????? ????? ????? ??????????.')!==false
    	//|| strpos($_POST['message'],'www.')!==false
    	){
    		$this->context->controller->errors[] = $this->l('Votre message contient du texte considéré comme du SPAM. N\'hésitez pas à nous appeler en cas de problème.');
    		return;
    	}
    
    1. je ne sais pas par quel mystère, les caractères accentués ont été remplacés par des ‘?’ dans mon message. A corriger en reprenant les le message de Odanimret ou en récupérant le texte dans les Spams reçus.

      1. Bonjour, j’ai ajouté votre code dans mon contactform.php, cela me donne une erreur 500 sur la page de contact.
        J’utilise PrestaShop 1.7.8.11 (contact form v4.4.2)

        J’ai inséré le code à la ligne 479, juste après :

        if ($url !== ''
            || empty($serverToken)
            || $clientToken !== $serverToken
            || $clientTokenTTL
        ) {
            $context->controller->errors[] = $this->trans(
                'An error occurred while sending the message, please try again.',
                [],
                'Modules.Contactform.Shop'
            );
            $this->createNewToken();
            return;
        }
        
        1. Le problème vient de cette ligne, qui créé une erreur 500 (étonnant…) :

          {
          $this->context->controller->errors[] = $this->l('Votre message contient du texte considéré comme du SPAM. N\'hésitez pas à nous appeler en cas de problème.');
          return;
          }
          
          1. C’est bon, il y avait une parenthèse en trop dans mon code, ne pas tenir compte de mes messages précédents !

  18. Bonjour à tous.
    Comme toujours super tutoriel merci Germain !
    Marche très bien sur PrestaShop V8. Mais curieusement depuis quelques jours j’ai à nouveau des spams avec des liens http qui arrivent ! Très bizarre car quand je copie le message reçu et que j’essaye de l’envoyer, j’ai bien le message d’erreur comme quoi les liens sont interdits, et pourtant… J’ai bien des messages qui arrivent. Les robots, auraient-ils réussi à déjouer le système ?

  19. Bonjour à tous,

    J’ai inséré le code de Rénato (merci a lui au passage) dans mon fichier contactform.php mais en faisant des tests ce qui doit etre considéré comme spam passe quand meme meme en ayant veillé à décommenter ce qui doit etre bloqué.

    Encore bravo et merci pour vos efforts et partages

  20. Bonjour Guillaume,

    J’aimerai que seuls mes clients inscrits sur mon site (ayant un compte enregistré) puissent envoyer des messages via le formulaire de contact.
    Est-ce possible ?
    Bravo pour ton site et tes astuces !!!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *