Od kilku dni możemy zauważyć, że w niektórych sklepach PrestaShop powstaje wiele, nowych kont klientów. Niestety nie są to, tacy klienci, jakich byśmy oczekiwali, są to boty, najczęściej posiadające w nazwisku adres do stron z treściami dla dorosłych, spamu, kasyn itd.


Na rynku pojawił się moduł, który rozwiąże te problemy już po jego instalacji.
Jeżeli nie jesteś przekonany, czy poradzisz sobie z modyfikacją, zalecam jego kupno 🙂

Moduł można nabyć tutaj: https://x13.pl/moduly-prestashop/zabezpieczenie-rejestracji-klientow-blokada-spamu.html

Aby zabezpieczyć się przed tym, musimy mieć dostęp do plików naszego sklepu, logujemy się na serwer, przechodzimy do katalogu z zawartością naszej instalacji PrestaShop, co dalej?

Problem polega na tym, że funkcja sprawdzająca poprawność tego, czy nazwisko klienta jest prawidłowe, nie bierze pod uwagę, że może ono wyglądać jak odnośnik do innej strony. Podstawowe zabezpieczenie jest, ale nie takie, które uchroni nas przed wstawieniem odpowiednio spreparowanego adresu strony internetowej w polu.

Najpierw, należy stworzyć plik: /override/classes/Validate.php, albo edytować już istniejący jeżeli wcześniej taki plik posiadaliśmy. Trzeba w nim dodać nową metodę:

public static function isCustomerName($name)
{
    if (preg_match(Tools::cleanNonUnicodeSupport('/www|http/ui'), $name)) {
       return false;
    }

    return preg_match(Tools::cleanNonUnicodeSupport('/^[^0-9!\[\]<>,;?=+()@#"°{}_$%:\/\\\*\^]*$/u'), $name);
}

cały plik powinien wyglądać, mniej więcej, tak:

<?php
class Validate extends ValidateCore
{
    public static function isCustomerName($name)
    {
        if (preg_match(Tools::cleanNonUnicodeSupport('/www|http/ui'), $name)) {
           return false;
        }

        return preg_match(Tools::cleanNonUnicodeSupport('/^[^0-9!\[\]<>,;?=+()@#"°{}_$%:\/\\\*\^]*$/u'), $name);
    }    
}

UWAGA: bardzo ważne by plik został zapisany z kodowaniem UTF-8, bez BOM, np. edytorem Notepad++, SublimeText lub innym, który zachowa odpowiednie kodowanie znaków specjalnych dostępnych w przykładzie. Bez tego, całość nie będzie działać.

Drugim etapem jest edycja pliku /classes/Customer.php (warto wcześniej zrobić jego kopię), znajdujemy w nim linie wyglądającą tak:

'lastname' =>                    array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32),
'firstname' =>                    array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32),

to co musimy zrobić, to zmiana isName, na isCustomerName

Po całej operacji zapisujemy plik, czyścimy cache w sklepie i sprawdzamy czy uda nam się zarejestrować konto z nickiem np. www.jakasdomena.pl, jeżeli nie – to oznacza, że z powodzeniem udało nam się zabezpieczyć nasz sklep.

Jak testować?

Poprawnie wprowadzona modyfikacja powinna:
1. nie zezwalać na rejestracje użytkowników z nazwiskiem, w którym znajdziemy frazę www lub http
2. powinna zezwalać na rejestracje użytkowników z normalnym nazwiskiem

Jeżeli nie działa to w ten sposób, oznacza to, że prawdopodobnie modyfikacja nie została przeprowadzona poprawnie, mam tu na myśli głównie kodowanie znaków, o którym była informacja wcześniej.

Aktualizacja 25.04.2019:

PrestaShop skomentowała problem, przedstawiając dwa rozwiązania,
dla PrestaShop 1.7.x: https://github.com/PrestaShop/PrestaShop/pull/13549
i PrestaShop 1.6.x: https://github.com/PrestaShop/PrestaShop/pull/13559

Więcej informacji na stronie: http://build.prestashop.com/news/fighting-against-spamming-again/

Uwaga: przedstawione rozwiązanie również może wiązać się z zapisem plików w odpowiednim kodowaniu znaków.

Oryginalne rozwiązanie, zostało przedstawione przez użytkownika doekia, na oficjalnym forum PrestaShop.