Annecy, Haute-Savoie
+33 (0)6 46 10 03 57
benoit@digital2ben.com

Stopper le SPAM de faux compte client sur Prestashop

Stopper le SPAM de faux compte client sur Prestashop

Après une première grande vague de SPAM sur les formulaires de contact de Prestashop, c’est à présent le formulaire de création de compte client qui est touché… Je vous explique comment rectifier le problème, pour éviter ces intrusions.

Attaque massive de SPAM sur Prestashop

Plusieurs de mes clients me contactent car des faux comptes clients s’enregistrent sur leur back-office Prestashop. L’année dernière, ça déjà était le cas avec du spam de Russie sur les formulaires de contact des boutiques Prestashop mais là c’est encore différent. Le problème c’est que cette intrusion vient salir votre base de données et pourrait même ternir à votre réputation.

Quel est l’objectif de ces SPAM de Compte client Prestashop ?

Il est toujours difficile de répondre précisément… parfois c’est simplement de nuire sans objectif précis. Le danger pour vous c’est que vous risquez de stocker des mails obsolètes et que si vous liez tout ça à un outil de mailing, vous pourriez être blacklisté. Si vous utilisez un service de mailing et que ces mails sont détectés comme frauduleux, la notoriété de votre domaine pourrait être remis en cause.

La sécurisation de Prestashop est-elle fiable  ?

Plus un outil est populaire, plus celui-ci est exposé à des tentatives de hacking, on voit régulièrement cette problématique par exemple avec WordPress… aucune solution n’est invulnérable. Et bien à cette question, je réponds oui, la solution Prestashop est fiable. Les techniques de Hacking évoluent et Prestashop doit subir des patchs de sécurité tout comme son système se voit mis à jour. Or, avant de faire une mise à jour complète de Prestashop, je vous recommande d’activer un patch comme présenté dans le tutoriel ci-dessous.

Comment bloquer l’intrusion du hacker ?

Les comptes clients qui sont créés contiennent en principe le nom d’un site web douteux dans le prénom ou le nom. Le principe est donc assez simple, on va vérifier le contenu de ces deux champs au moment de la validation du formulaire et afficher une erreur en retour si celui-ci contient une url. Chez les clients où le patch a été appliqué les intrusions ont cessées immédiatement.

Est-ce que ce correctif est durable ?

Oui pour le moment… cela dépendra si le hacker va améliorer sa méthode d’intrusion. Son but reste quand même d’injecter l’url d’un site web malicieux (pour tenter de faire du phishing ou autre). A mon avis il est possible que si le hacker utilise un nom / prénom classique, l’insertion fonctionne. Si cela arrive, il faudra passer au niveau supérieur avec une sécurité de plus du type reCatpcha, sécurité supplémentaire que je recommande à mes clients pour éviter les intrusions.

La solution pour stopper la création de faux compte client Prestashop.

  1. Accédez à votre FTP, dans le dossier admin accessible par les différents chemins selon votre hébergeur et votre installation. Par exemple : httpdocs/admin ou www/admin ou clickandbuilds/admin, prestashop/
  2. Créez un fichier nommé patch122.php
  3. Copiez le contenu ci-dessus, disponible également ici
    <? php
    / * Ce fichier doit être créé dans votre ADMIN_DIR * / 
    / * Ensuite, exécutez le fichier http (s): //domain.tld/ <admindir> /patch122.php * / 
    
    // Décommentez (supprimez //) la ligne suivante à des fins de débogage
    // @ define ('_ PS_MODE_DEV_', true);
    
    require_once (__ DIR __. '/ .. / config / config.inc.php');
    if (! version_compare (_PS_VERSION _, '1.5.4.0', '> =')) {
        die ('Désolé, seules les versions depuis 1.5.4.0 sont supportées.'. PHP_EOL);
    }
    $ ps_root_dir = _PS_ROOT_DIR_;
    (substr ($ ps_root_dir, -1,1)! = '/') && $ ps_root_dir. = '/';
    
    if (! file_exists ($ ps_root_dir.'override / classes / Validate.php ')) {
        $ content = <<< 'EOF'
    <? php
    classe Validate étend ValidateCore
    {
        fonction statique publique isCustomerName ($ name)
        {
            if (preg_match ('/ www | http / ui', $ name)) {
                retourne faux;
            }
    
            return preg_match ('/ ^ (?: [^ 0-9! <>,;? = + () \ / \\ @ # "° *` {} _ ^ $%: ¤ \ [\] | \ .。 ] | [\ .。] (?: \ S | $)) * $ / u ', $ name);
        }
    }
    EOF;
        fichier_put_contents ($ ps_root_dir.'override / classes / Validate.php ', $ content);
        @unlink ($ ps_root_dir.'cache / class_index.php ');
        echo 'class Validate est maintenant annulé' .PHP_EOL;
    }
    autre {
        echo 'La classe Validate est déjà remplacée. Vous devez traiter manuellement. '. PHP_EOL;
    }
    
    if (! file_exists ($ ps_root_dir.'override / classes / Customer.php ')) {
        $ content = <<< 'EOF'
    <? php
    
    classe Customer étend CustomerCore
    {
        / **
         * @see ObjectModel :: $ definition
         * /
        public static $ definition = array (
            'table' => 'client',
            'Primaire' => 'id_customer',
            'champs' => tableau (
                'secure_key' => array ('type' => self :: TYPE_STRING, 'validate' => 'isMd5', 'copy_post' => false),
                'lastname' => array ('type' => self :: TYPE_STRING, 'validate' => 'isCustomerName', 'required' => true, 'size' => 32),
                'prenom' => tableau ('type' => self :: TYPE_STRING, 'validate' => 'isCustomerName', 'required' => true, 'size' => 32),
                'email' => array ('type' => self :: TYPE_STRING, 'validate' => 'isEmail', 'required' => true, 'size' => 128),
                'passwd' => array ('type' => self :: TYPE_STRING, 'validate' => 'isPasswd', 'required' => true, 'size' => 32),
                'last_passwd_gen' => array ('type' => self :: TYPE_STRING, 'copy_post' => false),
                'id_gender' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedId'),
                'birthday' => array ('type' => self :: TYPE_DATE, 'validate' => 'isBirthDate'),
                'newsletter' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool'),
                'newsletter_date_add' => array ('type' => self :: TYPE_DATE, 'copy_post' => false),
                'ip_registration_newsletter' => array ('type' => self :: TYPE_STRING, 'copy_post' => false),
                'optin' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool'),
                'website' => array ('type' => self :: TYPE_STRING, 'validate' => 'isUrl'),
                'company' => array ('type' => self :: TYPE_STRING, 'validate' => 'isGenericName'),
                'siret' => array ('type' => self :: TYPE_STRING, 'validate' => 'isSiret'),
                'ape' => array ('type' => self :: TYPE_STRING, 'validate' => 'isApe'),
                'exceptionnel_allow_amount' => tableau ('type' => self :: TYPE_FLOAT, 'validate' => 'isFloat', 'copy_post' => false),
                'show_public_prices' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false),
                'id_risk' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedInt', 'copy_post' => false),
                'max_payment_days' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedInt', 'copy_post' => false),
                'active' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false),
                'supprimé' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false),
                'note' => array ('type' => self :: TYPE_HTML, 'validate' => 'isCleanHtml', 'size' => 65000, 'copy_post' => false),
                'is_guest' => array ('type' => self :: TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false),
                'id_shop' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
                'id_shop_group' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
                'id_default_group' => array ('type' => self :: TYPE_INT, 'copy_post' => false),
                'id_lang' => array ('type' => self :: TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
                'date_add' => array ('type' => self :: TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false),
                'date_upd' => array ('type' => self :: TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false),
            ),
        )
    
    }
    EOF;
        fichier_put_contents ($ ps_root_dir.'override / classes / Customer.php ', $ content);
        @unlink ($ ps_root_dir.'cache / class_index.php ');
        echo 'class Client est maintenant surchargé' .PHP_EOL;
    }
    autre {
        echo 'La classe Client est déjà remplacée. Vous devez traiter manuellement. '. PHP_EOL;
    }
    echo 'END'.PHP_EOL;
  4. Lancez le patch via votre navigateur :  https://votre-domaine.com/nom-de-votre-back-office/patch122.php par exemple : www.digital2ben.fr/admin000x0xxx0/patch122.php
  5. C’est fini, le spam de faux compte client Prestashop est résolu.

 

Si vous avez besoin d’aider à réaliser cette manipulation, n’hésitez pas à me contacter via le formulaire de contact

One Response

  1. Très facile à faire. Je vais voir si cela fonctionne, mais je pense 🙂

    Merci !

Laisser un commentaire

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