Le Spam sur une boutique en ligne telle que PrestaShop peut vous faire perdre un temps considérable. Nos amis Russes et autres pays spécialistes du Spam sont particulièrement virulents ces derniers temps. Le spam Russe, le spam Chinois et le spam des autres pays ne cessent de trouver de nouvelles techniques dans le but de contourner les anti-spams récents. Voici donc un nouvel article qui a pour but de partager une solution efficace afin de vous permettre de stopper le spam sur PrestaShop.
Le spam du formulaire de contact PrestaShop
Le formulaire de contact PrestaShop est vraisemblablement le plus touché par le Spam sur PrestaShop. De nombreux modules sont disponibles afin d’ajouter un captcha Google mais beaucoup d’entre eux laissent quand même passer les spams.
Le spam du SAV PrestaShop
Si le formulaire de contact est envahi par le spam, le SAV du backoffice sera également pollué. En effet les mails qui émanent du formulaire sont répertoriés dans l’interface d’administration de PrestaShop dans l’onglet SAV. Les messages de vos clients et prospects sont noyés parmi le spam.
Les risques du spam
En plus de vous faire perdre du temps dans la gestion de vos messages, le spam peut également être néfaste pour votre serveur si vous utilisez la fonction mail php. Votre serveur affecte des ressources afin de délivrer les messages. Si les messages sont en masse sur une courte période comme les spams, votre serveur consomme beaucoup de ressource et donc votre site peut subir des ralentissements.
Mais le risque surtout, si vous avez choisi de recevoir par notification email vos messages, est que votre nom de domaine soit mis sur liste noire. Les messages vous sont transférés via les notifications avec votre nom de domaine. Ce sera donc votre nom de domaine qui enverra du spam.
De plus si vous avez souscrit à un service comme mailjet, Sendinblue ou mailchimp et que vous utilisez leur service SMTP, vous consommerez votre forfait email à chaque envoi de notification de message qui est un spam.
Que se passe-t-il lors d’une soumission sur un formulaire ?
Pour bien comprendre comment fonctionne le spam, voici un petit rappel. Un formulaire de contact est composé de deux attributs sur la balise <form>
:
method
: cet attribut indique comment les données vont être envoyées. Il existe deux solutions pour envoyer des données sur le Web :la méthode "get"
: c’est une méthode en général assez peu adaptée car elle est limitée à 255 caractères. Les informations sont visible dans la barre d’adresse en tant que paramètres.la méthode "post"
: c’est la méthode généralement utilisée pour les formulaires. Les informations ne sont pas limités à un nombre de caractère. Les données ne sont pas visibles dans la barre d’adresse.
action
: c’est l’adresse de la page ou du programme qui va traiter les informations.
Comment fonctionne le spam sur PrestaShop ?
Généralement, les spams envoyés ne passent pas directement par le formulaire de contact. Ils sont générés par des scripts dans le language de prédilection de nos spammeurs. Pour cela rien de plus simple, il suffit de connaitre l’adresse de la page qui va traiter les messages du formulaire de contact. Dans notre cas il s’agit de la même adresse sur tous les formulaires de contact PrestaShop c’est à dire /index.php?controller=contact-form
qui est géré par le controller PrestaShop contactController.php
. Si vous utilisez la réécriture d’url de PrestaShop votre adresse sera alors par défaut /contactez-nous
. Les deux urls sont fonctionnelles, mais nos spammeurs utiliserons l’adresse qui n’est pas réécrite car celle-ci ne changera jamais.
Ainsi certains modules sont inefficaces car ils protègent uniquement la page où se trouve le formulaire de contact. Ils ne sont pas prévus pour les messages qui passent directement via la méthode « get » ou « post ».
La solution contre le spam du SAV et du formulaire de contact PrestaShop
Votre site doit être protégé du spam au niveau de votre serveur par votre hébergeur. Il existe de nombreuses applications serveur pour protéger votre site du spam (fail2ban, iptables, spam assassin…) Malheureusement tous les hébergements ne proposent pas une protection forcement optimale.
Une autre technique consiste à bloquer les spammeurs via la fonction de géolocalisation par IP de PrestaShop mais celle-ci pourra être contournée si le spam provient d’un proxy.
La solution anti spam pour PrestaShop 1.5 et PrestaShop 1.6
Je vous propose donc une solution que j’ai eu l’occasion de tester sur de nombreux sites sur le long terme. Elle consiste en l’intégration d’un reCaptcha nécessitant de mettre un peu les mains dans le code mais elle reste vraiment simple. Le code est fourni depuis ce snippet par Doekia. Je vous invite à lui payer un café en cliquant sur le bouton disponible sur le snippet si vous utilisez son code ;-).
Etape 1 – Générer les clés
Commencez par aller générer vos clés en utilisant la méthode recaptcha2 ici: https://www.google.com/recaptcha/admin
Etape 2 – Copie du premier script
Copiez/collez le premier script dans le fichier index.php à la racine de votre site web juste après les commentaires et avant avant les premières lignes de code php en remplaçant XXXXXXX-the-secret-key-XXXXXXXXXX par votre clé secrète.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
if (isset($_REQUEST[fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"]['submitMessage'])) { if (empty($_REQUEST['g-recaptcha-response'])) { sleep(25); die('not human'); } $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => http_build_query( $post = array( 'secret' => 'XXXXXXX-the-secret-key-XXXXXXXXXX', 'response' => $_REQUEST['g-recaptcha-response'], ) ), ), ); if (in_array(ini_get('allow_url_fopen'), array('On', 'on', '1'))) { $stream = stream_context_create($opts); $captcha = @json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, $stream), true); } elseif (function_exists('curl_init')) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $post, ) ); $captcha = @json_decode(curl_exec($curl),true); curl_close($curl); } else { // buggy hoster ! $captcha = array('error' => 'buggy hoster'); } if (empty($captcha['success'])){ if(!empty($_SERVER['HTTP_REFERER'])) { sleep(5); die(' Captcha Invalide <a href="'.$_SERVER['HTTP_REFERER'].'"><button>Retour au formulaire</button></a>'); } sleep(25); die('not human'); } } |
Etape 3- Copie du second script
Copiez/collez le second script dans le fichier header.tpl de votre thème juste avant la fermeture de la balise </head>
en remplaçant XXXXXXX-the-public-site-key-XXXXXXXXX par votre clé publique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<!-- Copyright (c)2017-2018 (d)oekia Enter-Solutions GPL --> <!-- Google ReCaptcha on contact form --><script>// <![CDATA[ (function(){ var googlecaptchasitekey = 'XXXXXXX-the-public-site-key-XXXXXXXXX'; var trigger = function(){ setTimeout(function(){ $('div.g-recaptcha').remove(); var $forms = $('form.contact-form-box,form#sendOrderMessage'); if ($forms.length > 0){ var captcha = $(' <div class="g-recaptcha" data-sitekey="'+ googlecaptchasitekey + '">'); var $submit = $forms.find('#submitMessage,.button[name=submitMessage]'); $submit.before(captcha); $submit.click(function(event){ if ($forms.find('#g-recaptcha-response').val().length == 0) { event.preventDefault(); event.stopPropagation(); return false; } }); try { window.grecaptcha.render(captcha[0]); } catch(e){}; } },1000); }; $(document).ready(trigger); $(document).bind('ajaxComplete', trigger); })(); // ]]></script>{if !isset($language_code)}{assign var="language_code" value=$lang_iso}{/if}<script src="https://www.google.com/recaptcha/api.js?hl={$language_code}"></script><script>// <![CDATA[ if ( window.history.replaceState ) { window.history.replaceState( null, null, window.location.href ); } |
Cette solution est adaptée pour la plupart des thèmes mais vous pouvez si vous le souhaitez l’optimiser en fonction de votre site et de votre thème.
La solution anti spam pour Prestashop 1.7
Je vous propose une solution anti-spam pour prestashop 1.7 plus simple via l’installation du module eicaptcha développé par Hervé Hennes et mis gracieusement à disposition sur son profil Github. Je tiens à préciser que contrairement à la solution précédente pour Prestashop 1.6, je n’ai pas vérifié celle-ci sur le long terme. A noter également que cette solution ajoute si vous le souhaitez le reCaptcha sur la formulaire d’inscription.
Etape 1 – Générer les clés
Commencez par aller générer vos clés en utilisant la méthode recaptcha2 ici: https://www.google.com/recaptcha/admin
Etape 2 – Configuration du module
Installez le module, il vous suffira ensuite de copier-coller la clé publique et la clé secrète dans la configuration du module reCAPTCHA dans PrestaShop.
Le reCaptcha sur Pretashop
Nous venons de voir des solutions efficaces disponibles gratuitement. Si vous n’avez pas le temps ou les compétences pour effectuer la mise en place de telles solutions, n’hésitez pas à me contacter !
// ]]>
[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]
Plus de Spam ! Merci Adrien pour cette astuce !
Salut Ben
Je suis ravi que ce tuto ait pu vous aider 🙂