SPAM z formularza kontaktowego PrestaShop 1.6

Spamerzy non stop kombinują jak tu wykorzystać do swoich niecnych celów formularze dostępne na stronach internetowych. Czyli jak zasypać innych wirtualnymi śmieciami.

Tak tak, śmieciami, ponieważ z reguły oferty spamerów tak mi pasują jak te w stylu „kup pan cegłę”. Kto nie wie skąd ten cytat polecam stare polskie kino „Ewa chce spać”. Niesamowite dialogi i warszawski slang.

Jest tam scenka z opryszkiem, który szkolony był jak odpowiednio podejść osobę na ulicy i niekoniecznie chodziło o podejście siłowe, czyli cegła nie stanowiła jedynego atutu. Liczyło się odpowiednie, kulturalne podejście do „klienta”. Opryszek bardzo elokwentnie przedstawił propozycję nie do odrzucenia: „Panie szanowny! Kup pan te cegłę! Odpalasz pan stówkę ocalasz pan główkę!”. Czyli dobijając do brzegu, chodzi mi o to, że oferta spamerów jest mi całkiem zbyteczna, tylko tracę czas na odgruzowanie poczty ze śmieci.

Tym razem spamerzy wykorzystali brak zabezpieczeń w domyślnym formularzu kontaktowym sklepu internetowego opartego o silnik PrestaShop 1.6. Poskutkowało to masowym otrzymywaniem syfu pisanego głównie w cyrylicy.
Rozwiązanie, znalezione na oficjalnym anglojęzycznym forum wsparcia PrestaShop jest proste do zaimplementowania.

1. Wchodzimy do usługi Google reCaptcha. Aby z niej za darmo skorzystać należy posiadać konto w usługach Google.

2. Dodajemy tam naszą domenę i generujemy dwa klucze, czyli ciągi znaków.

3. Do nagłówka strony, czyli do pliku header.tpl w naszym szablonie, dodajemy tuż przed </head> następujący kod:

<script src="https://www.google.com/recaptcha/api.js"></script>

4. W szablonie contact-form.tpl przed </form> wstawiamy:

<div class="g-recaptcha" data-sitekey="[public Google key]"></div>

Uwaga! Należy wpisać klucz publiczny wygenerowany w usłudze reCaptcha w miejscu: [public Google key]

5. Na końcu otwieramy plik:
/controllers/front/ContactController.php

po linii:

$this->errors[] = Tools::displayError('Bad file extension');

wklejamy kod:

else if (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response'))))
 $this->errors[] = Tools::displayError('Captcha not verified');

Dla pewności jak on powinien wyglądać po wklejeniu podaję większy fragment kodu z pogrubieniem nowego:

else if (!empty($fileAttachment['name']) && !in_array( Tools::strtolower(substr($fileAttachment['name'], -4)), $extension) && !in_array( Tools::strtolower(substr($fileAttachment['name'], -5)), $extension))
 $this->errors[] = Tools::displayError('Bad file extension');
else if (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response'))))
 $this->errors[] = Tools::displayError('Zaznacz ptaka, że nie jesteś spamerem :-)');
else {

To wszystko, formularz jest zabezpieczony, a ruskije partizanty muszą kombinować gdzie indziej. Mogą na przykład zająć się szkoleniem gołębi na pucybuty.
No co? Jakoś trzeba było wytłumaczyć dołączone zdjęcie ;-)

3 marca 2018, Tomasz Bartosiewicz, komentarzy 6

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

6 myśli nt. „SPAM z formularza kontaktowego PrestaShop 1.6”

  1. Haniu, trudno cokolwiek powiedzieć bez zajrzenia do kodu, ale wygląda na to, że gdzieś zrobiłaś błąd. To rozwiązanie przetestowałem na kilku wersjach Prestashop 1.6.x

  2. Witam, fajnie prosto napisane poradziłam sobie spokojnie z tym że gdy wysyłam wiadomość wcale nie trzeba zaznaczyć kwadracika tylko wysyła nawet bez zaznaczenia :(

    Jakiś błąd z mojej strony?

  3. Dobry artykuł. Podobno roboty potrafią już ominąć reCaptcha, jednak nie jest to jeszcze tak powszechne i w większości przypadków spełnia oczekiwania.

  4. Kurza burza! A to niespodzianka,
    nie zauważyłem, że WordPress zmienia apostrofy oraz cudzysłowia na inne jakieś znaki.
    Już poprawiłem, przepraszam za niedopatrzenie i dzięki Ewelino za odzew.
    Teraz powinno działać, jeśli kod wkleisz dokładnie tak jak jest podany.
    Dorzuciłem jeszcze większy kawałek kodu do podglądu, jak to dokładnie ma wyglądać.

  5. Strona /kontakt działa jak usunę kod

    else if (!($gcaptcha = (int)(Tools::getValue(‚g-recaptcha-response’))))
    $this->errors[] = Tools::displayError(‚Captcha not verified’);

  6. hej, wszystko zrobione tak jak napisane w artykule, a po wejściu na podstronę /kontakt mam komunikat

    Ta strona nie działa
    Serwer xxxx nie może teraz obsłużyć tego żądania.

    Presta 1.6.1.8

    gdzie mogę mieć problem ?
    Pozdrawiam