en Jump to content
magisterson

Ataki mailowe na Prestę - poradnik re-captcha

Recommended Posts

W związku z nasilającymi się atakami na sklepy prestashop w Polskim internecie (głównie zaobserowaliśmy te ataki na serwerach nazwa.pl) chcę napisać mini poradnik dla wszystkich których ten problem dotyczy. Boty korzystają z formularza kontaktowego w sklepie. Rozwiązaniem może być instalacja darmowej re-captcha od Google. Jest kilka pluginów do tego, ale po co płacić 50 zł jak można to zrobić w kilka sekund samemu. A więc:

1. wchodzimy na: KLIK i klikamy GET recaptcha u góry po prawej

2. w oknie "register new site" wpisujemy w LABEL: co chcecie np. nazwe waszej strony, ponizej wybieramy "RECAPTCHA V2" w "domains" wpisujemy adres sklepu czyli np. mojsklep.pl (bez prefiksów www, http itp.)

3. klikamy REGISTER

4. Przechodzimy do FTP naszego sklepu a konkretniej do pliku /themes/nazwa-szablonu/header.tpl

5. odnajdujemy zamykający </head> i tuż nad nim wklejamy:

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

6. zapisujemy i podmieniamy plik na serwerze (czyścimy cache - lub nie - zależnie od ustawień sklepu)

7. Przechodzimy do pliku contact-form.tpl (który jest w tym samym folderze co header.tpl)

odnajdujemy fragment kodu: 

<div class="submit">
				<button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium"><span>{l s='Send'}<i class="icon-chevron-right right"></i></span></button>
			</div>

i tuż nad nim wklejamy: 

<div class="g-recaptcha" data-sitekey="KOD-CAPTCHA"></div>

Gdzie KOD-CAPTCHA to wasz unikatowy numer (czyli jest to w skrócie kod z punktu 1 na stronie re-captcha)

8. zapisujemy, nadpisujemy na serwerze i czyścimy cache (tak jak powyżej przy pliku header)

9. Przechodzimy do /controllers/front/ContactController.php - otwieramy plik i szukamy:

$this->errors[] = Tools::displayError('Invalid email address.');

Tuż za wklejamy:

// start kodu
} elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response')))) {
$this->errors[] = Tools::displayError('Captcha error');
// koniec kodu

10. zapisujemy, wrzucamy na serwer aby podmienić

 

Teraz recaptacha powinna działać, a boty nie powinny wam zagrażać.
Dodatkowo możecie prześledzić logi serwera i zablokować w pliku .htaccess podejrzane adresy IP

Share this post


Link to post
Share on other sites

Fajnie, że ktoś zrobił poradnik, chciałbym jednak dodać, że to sprawdzenie:

// start kodu
} elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response')))) {
$this->errors[] = Tools::displayError('Captcha error');
// koniec kodu

musi być odrobinę dokładniejsze, potrzebujemy sprawdzenia po stronie Google czy odpowiedź od modułu captcha jest prawidłowa bo inaczej atakujący mogą dodać jakąkolwiek wartość liczbową dla g-recaptcha-response i w zasadzie rozwiązanie leży.

Tutaj krótki snippet sprawdzania poprawności odpowiedzi:

$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
    'secret' => 'xxxx_SECRET_KEY_Xxxx',
    'response' => $_POST["g-recaptcha-response"]
);
$query = http_build_query($data);
$options = array(
    'http' => array (
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:RecaptchaTimetrend/1.0\r\n",
        'method' => 'POST',
        'content' => $query
    )
);
$context  = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success = json_decode($verify, true);

if (!$captcha_success['success']) {
    $this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
}

 

Share this post


Link to post
Share on other sites

Dzięki za szybką odpowiedź. Czym prędzej sobie z tym poradzimy tym lepiej. Czyli kod który podałeś:

$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
    'secret' => 'xxxx_SECRET_KEY_Xxxx',
    'response' => $_POST["g-recaptcha-response"]
);
$query = http_build_query($data);
$options = array(
    'http' => array (
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:RecaptchaTimetrend/1.0\r\n",
        'method' => 'POST',
        'content' => $query
    )
);
$context  = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success = json_decode($verify, true);

if (!$captcha_success['success']) {
    $this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
}

dodajemy zamiast tego z mojego posta? W którym miejscu?

Share this post


Link to post
Share on other sites

W tym momencie nie mogę ale zaktualizuje temat o odpowiedni plik zarówno dla PrestaShop 1.6 jak i PrestaShop 1.7 z naniesionymi zmianami i wstawie screenshoty jaki kod doszedł. Zrobię to za kilka godzin.

Generalnie kod, który wkleiłeś też powinien zostać bo gdy captchy nie ma to powinniśmy zwrócić błąd, ten ode mnie powinien być dalej gdzie zweryfikujemy czy jest poprawny jeżeli istnieje :)

Share this post


Link to post
Share on other sites

OK, postaram się pogrzebać w tym i dodam też Twoje rozwiązanie do sklepu Jak znajdziesz wolną chwilę to społeczność z pewnością będzie wdzięczna za screeny, to co się dzieje to prawdziwy armagedon :D

Share this post


Link to post
Share on other sites

Dzieki wielkie za przesłanie rozwiązania. Ostatnio dostałem 1500 wiadomości.

Chciałem dylko dopytać czy caly kod ma wygladac dokladnie w ten sposob.

} elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response')))) {
$this->errors[] = Tools::displayError('Captcha error');
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
    'secret' => 'xxxx_SECRET_KEY_Xxxx',
    'response' => $_POST["g-recaptcha-response"]
);
$query = http_build_query($data);
$options = array(
    'http' => array (
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:RecaptchaTimetrend/1.0\r\n",
        'method' => 'POST',
        'content' => $query
    )
);
$context  = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success = json_decode($verify, true);

if (!$captcha_success['success']) {
    $this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
}

Share this post


Link to post
Share on other sites

No tak, ale to nadal jest to co opisałem w pierwszym poscie, a Krystian zaproponował jeszcze:

 

$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
    'secret' => 'xxxx_SECRET_KEY_Xxxx',
    'response' => $_POST["g-recaptcha-response"]
);
$query = http_build_query($data);
$options = array(
    'http' => array (
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:RecaptchaTimetrend/1.0\r\n",
        'method' => 'POST',
        'content' => $query
    )
);
$context  = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success = json_decode($verify, true);

if (!$captcha_success['success']) {
    $this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
}

 

Share this post


Link to post
Share on other sites

Tak wygląda połączenie obu kodów, które należy wkleić. U mnie w PS 1.6.1.4 działa, podłożenie jakiejkolwiek wartości w odpowiedzi również wywala błąd Captcha - plik, na którym pracowałem (ContactController.php) znajdował się w root/controllers/front/ContactController.php

Pozostałe kroki zgodnie z intrukcją zamieszczoną i spolszczoną przez kolegę magisterson.

 

				// add the 2 lines from here
 } elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response')))) {
 $this->errors[] = Tools::displayError('Captcha error');
 $url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
    'secret' => 'KOD Z REJESTRACJI GOOGLE RECAPTCHA',
    'response' => $_POST["g-recaptcha-response"]
);
$query = http_build_query($data);
$options = array(
    'http' => array (
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($query)."\r\n"."User-Agent:RecaptchaTimetrend/1.0\r\n",
        'method' => 'POST',
        'content' => $query
    )
);
$context  = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success = json_decode($verify, true);

if (!$captcha_success['success']) {
    $this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
}
						// to here

 

Share this post


Link to post
Share on other sites

Kurowski - czy przedstawiony przez Ciebie powyższy kod nie wyświetla czasem podwójnego komunikatu o braku zaznaczenia captcha?
Mam na myśli konkretnie te linijki kodu:

$this->context->controller->errors[] = 'Prosimy o zaznaczenie zabezpieczenia Captcha';
$this->errors[] = Tools::displayError('Captcha error');
Edited by Slizeer

Share this post


Link to post
Share on other sites

Zastanawiam się, czy twórcy presty w głównych ustawieniach nie powinni dodać pola do wartości PS_RECAPTCHA_SECRET_KEY oraz PS_RECAPTCHA_SITE_KEY w których można by było wpisać te wartości i łatwiej integrać recaptchę w modułach. 

Share this post


Link to post
Share on other sites

W załączniku udostępniam łatkę która robi prostą integracje recaptcha z formularzem kontaktowym.

Zawartość paczki należy skopiować na serwer. Nadpisywania w sklepie muszą być włączone, trzeba wyczyścić cache/usunąc plik class_index.php z folderu cache.

Klucze recaptcha wpisujemy w panelu admina w Klienci->Biuro Obsługi Klienta, w sekcji Opcje Kontaktu.

Łatka była robiona dla wersji 1.6.1.18,  w starszych wersjach chyba też powinna działać

recaptcha-integracja.zip

 

Share this post


Link to post
Share on other sites
IGD    0
On 22.03.2018 at 12:36 PM, atomek said:

W załączniku udostępniam łatkę która robi prostą integracje recaptcha z formularzem kontaktowym.

Zawartość paczki należy skopiować na serwer. Nadpisywania w sklepie muszą być włączone, trzeba wyczyścić cache/usunąc plik class_index.php z folderu cache.

Klucze recaptcha wpisujemy w panelu admina w Klienci->Biuro Obsługi Klienta, w sekcji Opcje Kontaktu.

Łatka była robiona dla wersji 1.6.1.18,  w starszych wersjach chyba też powinna działać

recaptcha-integracja.zip

 

 

Czy mam wejść w to miejsce aby wpisać teraz kody re captcha? (secret key? czy Site key ?) 

Ponieważ po usunięciu pliku z folderu cache, po wejściu w wiele zakładek w panelu admina nie moge wyswietlić strony

presta.png

Edited by IGD

Share this post


Link to post
Share on other sites
11 godzin temu, IGD napisał:

 

Czy mam wejść w to miejsce aby wpisać teraz kody re captcha? (secret key? czy Site key ?) 

Ponieważ po usunięciu pliku z folderu cache, po wejściu w wiele zakładek w panelu admina nie moge wyswietlić strony

presta.png

 

Pola do wpisania kluczy powinny się pojawić w "Klienci -> Biuro obsługi klienta", tak jak na obrazku poniżej.

5ab89a6534d50_BiuroObsugiKlienta-Testowy.thumb.png.2b108d5c8b85e46ef3ae6af5df3dc3ea.png


Zobacz czy w Parametry zaawansowane -> Wydajność masz włączone nadpisywania. Opcje "Wyłącz wszystkie nadpisywania" ustaw na "Nie".
Na górze strony jest guzik "Wyczyść pamięć podręczna" - możesz też to zrobić.

 

Share this post


Link to post
Share on other sites
IGD    0
6 minutes ago, atomek said:

 

Pola do wpisania kluczy powinny się pojawić w "Klienci -> Biuro obsługi klienta", tak jak na obrazku poniżej.

5ab89a6534d50_BiuroObsugiKlienta-Testowy.thumb.png.2b108d5c8b85e46ef3ae6af5df3dc3ea.png


Zobacz czy w Parametry zaawansowane -> Wydajność masz włączone nadpisywania. Opcje "Wyłącz wszystkie nadpisywania" ustaw na "Nie".
Na górze strony jest guzik "Wyczyść pamięć podręczna" - możesz też to zrobić.

 

 

 

 

Sprawdzałem, miałem ustawione na 'nie' i usunąłem pamieć podręczna. Wciąż nie mam w zakładce klienta 'Biuro Obsługi Klienta' 

prrr.png

Share this post


Link to post
Share on other sites

Jak wygląda u Ciebie teraz strona "Biuro obsługi klienta"? Podeślij zrzut ekranu.

Gdzie skopiowałeś zawartość paczki? Do jakich folderów?

Share this post


Link to post
Share on other sites
IGD    0
Just now, atomek said:

Jak wygląda u Ciebie teraz strona "Biuro obsługi klienta"? Podeślij zrzut ekranu.

Gdzie skopiowałeś zawartość paczki? Do jakich folderów?

 

Pliki nadpisywałem za kazdym razem idąc po folderach ktore byly w archiwum

Sęk w tym że nie mam w liscie 'Biuro obsługi klienta' tylko stare 'Obsluga klienta'

podczas próby otwarcia 'Obsluga klienta' pokazuje mi sie strona :

Ta strona nie działa

Serwer jkbygg.webd.pl nie może teraz obsłużyć tego żądania.

HTTP ERROR 500

Share this post


Link to post
Share on other sites

A konkretnie do jakich folderow?

Plik z paczki: override\controllers\admin\AdminCustomerThreadsController.php powinien trafić do /override/controllers/admin/AdminCustomerThreadsController.php

Plik z paczki: override\controllers\front\ContactController.php powinien trafić do override/controllers/front/ContactController.php


Po prostu skopiuj cały folder override do głównego folderu Twojego sklepu na serwerze.


Jeżeli nadpisałeś te pliki w folderze /controllers, to musisz przywrócić ich oryginalne wersje.

Share this post


Link to post
Share on other sites
IGD    0
15 minutes ago, atomek said:


Jeżeli nadpisałeś te pliki w folderze /controllers, to musisz przywrócić ich oryginalne wersje.

 

Ok wiec tak, napewno pliki trafiły do odpowiednich folderów, tylko teraz nie rozumiem dlaczego zalecasz przywrócić oryginalne pliki skoro wyżej polecasz je nadpisać plikami  z archiwum ?

Share this post


Link to post
Share on other sites
5 minut temu, IGD napisał:

 

Ok wiec tak, napewno pliki trafiły do odpowiednich folderów, tylko teraz nie rozumiem dlaczego zalecasz przywrócić oryginalne pliki skoro wyżej polecasz je nadpisać plikami  z archiwum ?

Napisałem Jeżeli...
Nie wiem gdzie te pliki skopiowałeś, nie podałeś lokalizacji.

Zwróć uwagę na ścieżki.

Share this post


Link to post
Share on other sites
IGD    0
19 minutes ago, atomek said:

Napisałem Jeżeli...
Nie wiem gdzie te pliki skopiowałeś, nie podałeś lokalizacji.

Zwróć uwagę na ścieżki.

 

 

Ok rozumiem, więc pliki skopiowane są do odpowiednich folderów i mimo to nie mogę wejść do zakładki 'Biuro obsługi klienta'

 

Share this post


Link to post
Share on other sites
Tra    0
Dnia 22.03.2018 o 12:36 PM, atomek napisał:

W załączniku udostępniam łatkę która robi prostą integracje recaptcha z formularzem kontaktowym.

Zawartość paczki należy skopiować na serwer. Nadpisywania w sklepie muszą być włączone, trzeba wyczyścić cache/usunąc plik class_index.php z folderu cache.

Klucze recaptcha wpisujemy w panelu admina w Klienci->Biuro Obsługi Klienta, w sekcji Opcje Kontaktu.

Łatka była robiona dla wersji 1.6.1.18,  w starszych wersjach chyba też powinna działać

recaptcha-integracja.zip

 

Cześć,

mam wersje 1.7.2.4, skopiowałem Twoje pliki, nadpisywania ustawiłem jak napisałeś, w menu "Obsługa klienta" wypełniłem oba pola z kluczami recaptcha, niestety w formularzu kontaktowym captcha się nie pojawiła ale przy próbie wysłania wiadomości przez niego wyrzuca mi

  • Captcha error!!!
  • Captcha error

co zrobiłem źle ?

przez święta miałem kilkadziesiąt wiadomości wszystkie z domen *.ru, musze szybko coś z tym zrobić :/

 

Share this post


Link to post
Share on other sites
30 minut temu, Tra napisał:

Cześć,

mam wersje 1.7.2.4, skopiowałem Twoje pliki, nadpisywania ustawiłem jak napisałeś, w menu "Obsługa klienta" wypełniłem oba pola z kluczami recaptcha, niestety w formularzu kontaktowym captcha się nie pojawiła ale przy próbie wysłania wiadomości przez niego wyrzuca mi

  • Captcha error!!!
  • Captcha error

co zrobiłem źle ?

przez święta miałem kilkadziesiąt wiadomości wszystkie z domen *.ru, musze szybko coś z tym zrobić :/

 

Zakładam że wszystko zrobiłeś dobrze. Łatka była robiona dla wersji 1.6, w Prescie 1.7 działać chyba nie będzie (bez przeróbek).

Share this post


Link to post
Share on other sites
Dnia 3.04.2018 o 1:44 PM, atomek napisał:

Zakładam że wszystko zrobiłeś dobrze. Łatka była robiona dla wersji 1.6, w Prescie 1.7 działać chyba nie będzie (bez przeróbek).

Posiadam wersję 1.6.1.18 i u mnie jest analogiczny problem.

Captcha error!!!
Captcha error

 

Przy zapisywaniu kluczy pojawia się komunikat 

IMAP configuration is not correct

Share this post


Link to post
Share on other sites
1 godzinę temu, Jacek napisał:

Posiadam wersję 1.6.1.18 i u mnie jest analogiczny problem.

Captcha error!!!
Captcha error

 

Przy zapisywaniu kluczy pojawia się komunikat 

IMAP configuration is not correct

Spróbuj podmienić plik /override/controllers/front/ContactController.php na ten z załącznika.

Komunikat "IMAP configuration is not correct" to chyba taki urok presty, na czystej wersji też to występuje.

ContactController.zip

 

Share this post


Link to post
Share on other sites
5 godzin temu, atomek napisał:

Spróbuj podmienić plik /override/controllers/front/ContactController.php na ten z załącznika.

Komunikat "IMAP configuration is not correct" to chyba taki urok presty, na czystej wersji też to występuje.

ContactController.zip

 

Po zamianie pojawia się jeden błąd - Captcha error

Nadal nie wyświetla się re-captcha.

Share this post


Link to post
Share on other sites
1 godzinę temu, Jacek napisał:

Po zamianie pojawia się jeden błąd - Captcha error

Nadal nie wyświetla się re-captcha.

W paczce recaptcha-integracja.zip jest folder __TWOJ_SZABLON__, w nim jest plik contact-form.tpl. Co z tym plikiem zrobiłeś?

Plik należy przekopiować do folderu gdzie znajduje się Twój szablon (zostanie nadpisany) - dla standardowej skórki presty 1.6 to /themes/default-bootstrap. Nie wiem z jakiego szablonu korzystasz, u Ciebie może być inaczej.

Nie musisz nadpisywać swojego pliku, wystarczy że wprowadzisz zmiany tak jak w pliku z załącznika - są w nim opisane.

Wymuś kompilacje szablonu.

W razie problemów włącz tryb debugowania.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More