CAPTCHA to test / zadanie, które ma być bardzo łatwe do wykonania przez przeciętnego człowieka ale zarazem bardzo trudne do wykonania przez komputer. Akronim CAPTCHA pochodzi z języka angielskiego: Completely Automated Public Turing test to tell Computers and Humans Apart. W wolnym tłumaczeniu: Całkowicie zautomatyzowany publiczny test Turinga, aby odróżnić komputery od ludzi.
Test Turinga to test, który miał określać zdolność maszyny do symulowania ludzkiej inteligencji. Nazwa testu Turinga bierze się stąd, że to właśnie Alan Turing – brytyjski matematyk i kryptolog – zaproponował taki test w ramach badań nad sztuczną inteligencją. Test Turinga bynajmniej nie polega na zaznaczeniu obrazków zawierających autobus czy przejście dla pieszych. Oryginalny test Turinga polegał na tym, że sędzia prowadzi rozmowę w języku naturalnym z komputerami i ludźmi. Konwersacja może polegać na wymianie wiadomości. Maszyna zalicza test, kiedy sędzia nie jest w stanie określić kto jest maszyną a kto człowiekiem.
W jakim celu stosujemy CAPTCHA?
W przypadku serwisów internetowych, zabezpieczenie CAPTCHA stosujemy głównie wtedy kiedy chcemy utrudnić wysyłanie zautomatyzowanych zapytań HTTP. CAPTCHA może skutecznie chronić przed spamem i atakami brute-force, które polegają na bezustannym wysyłaniu formularzy przez bądź co bądź proste skrypty.
Jak stworzyć CAPTCHA?
Proste rozwiązania CAPTCHA można napisać samodzielnie. Z pewnością każdy z nas natknął się na obrazkowe rebusy, pytania o stolicę Polski czy prośby o wykonanie prostych działań matematycznych. To proste skrypty z instrukcją warunkową, którą jest w stanie napisać bardzo początkujący programista PHP.

Z drugiej strony, jeżeli komuś bardzo zależy na obejściu takich zabezpieczeń to w końcu uda mu się tego dokonać i w dodatku istnieje ryzyko, że w przypadku takich własnych rozwiązań CAPTCHA zauważalnie pogorszymy jakość doświadczeń użytkowników. Istnieje wiele gotowych implementacji zabezpieczenia CAPTCHA, które nie utrudniają korzystania z serwisu i reCAPTCHA jest jednym z nich.
Co to jest reCAPTCHA?
reCAPTCHA to propozycja CAPTCHA stworzona przez Google. Najnowsza wersja reCAPTCHA to 3.0. Test reCAPTCHA 3.0 wykorzystuje zaawansowany silnik analizy ryzyka i wyzwania adaptacyjne, aby powstrzymać złośliwe oprogramowanie przed wykonywaniem jakichkolwiek nadużyć w Twoim serwisie internetowym. Tymczasem prawdziwi użytkownicy będą mogli się logować, robić zakupy, przeglądać strony lub tworzyć konta bez jakichkolwiek zakłóceń.

Zalety reCAPTCHA
- sprawdzone przez wiele lat narzędzie antyspamowe na ponad pięciu milionach witryn internetowych z całego świata,
- bezproblemowa usługa wykrywania botów przy jednoczesnym braku przeszkód dla normalnych użytkowników witryny,
- oparte na analizie ryzyka algorytmy reCAPTCHA stosują ciągłe uczenie maszynowe, które uwzględnia każdą interakcję z klientem i botem – w ten sposób osiągana jest przewaga nad tradycyjnymi technologiami wykrywania botów opartych na „wyzwaniach”.
Wady reCAPTCHA
- wymagane jest informowanie użytkowników o wykorzystywaniu systemu reCAPTCHA,
- dodatkowy kod dodawany do strony może znacząco obniżyć jej wydajność i wyniki w PageSpeed Insights.
Integracja reCAPTCHA w PHP
W tym przewodniku dokonamy integracji naszej aplikacji PHP z reCAPTCHA v3.
Krok 1: Rejestracja nowej witryny w Google reCAPTCHA
Na stronie https://www.google.com/recaptcha/admin/create rejestrujemy nową witrynę do integracji z reCAPTCHA. Wpisujemy etykietę (może to być nazwa serwisu lub domena) oraz zaznaczamy opcje integracji:

Po zatwierdzeniu tego formularza otrzymamy Klucz witryny do zastosowania we front-endzie oraz Tajny klucz do zastosowania w back-endzie aplikacji.

Zapisujemy sobie klucze, bo będą dla nas przydatne w kolejnych krokach. Link „Przejdź do Analytics” prowadzi do specjalnego panelu, w którym możemy śledzić liczbę zablokowanych botów.
Krok 2: Integracja reCAPTCHA po stronie klienta
Dodamy teraz odpowiedni JavaScript oraz dokonamy drobnych edycji kodu HTML stron, które chcemy zabezpieczyć za pomocą reCAPTCHA. Przed znacznikiem zamykającym </body> dodajemy link do skryptu:
<script src="https://www.google.com/recaptcha/api.js"></script>
Po nim dopiszemy funkcję zwrotną:
function onSubmit(token) { document.getElementById("demo-form").submit(); }
Do przycisku, który przykładowo ma zatwierdzać formularz dodajemy dodatkowe atrybuty:
<button class="g-recaptcha" data-sitekey="klucz_witryny_reCAPTCHA" data-callback='onSubmit' data-action='submit'>Submit</button>
Jeżeli za wysłanie formularza odpowiada AJAX, to oczywiście nie musimy dodawać linijki zawierającej metodę submit() a zamiast tego dodajemy nowe pole do naszej funkcji post:
function onSubmit(token) { var login = $('#login').val(); var password = $('#password').val(); $.post('script.php', {login: login, password: password, g-recaptcha-response:token}, function(output){ $(#info).html(output); }
Za pomocą instrukcji console.log(token); możemy sprawdzić czy skrypt działa. Dodatkową wskazówką, że wszystko jest wykonane prawidłowo, będzie pojawienie się znaczka reCAPTCHA w prawym dolnym rogu witryny. Po najechaniu na niego kursorem, znaczek rozwinie się i wyświetli dodatkowe informacje:

Krok 3: Integracja reCAPTCHA po stronie back-endu (PHP)
Mimo całkowicie poprawnej integracji reCAPTCHA po stronie klienta, nie posiadamy jeszcze żadnej korzyści wynikającej z obecności dodatkowego kodu JavaScript na naszej stronie. Kod JavaScript dodaje do formularza specjalny token, którego poprawność musi być sprawdzona po stronie serwera. Jeżeli token jest poprawny to skrypt ma w założeniu wykonać to co chce zrobić użytkownik serwisu. Jeżeli token nie został podany lub z jakichś powodów jest on nieprawidłowy – skrypt ma zwrócić błąd.
Niezależnie jakiej metody użyliśmy do przesłania tokenu do back-endu (z przeładowaniem strony lub za pomocą AJAX) to do tablicy $_POST zostanie dodana wartość z tokenem pod kluczem g-recaptcha-response. Token możemy wtedy pobrać w taki sposób:
$token = $_POST["g-recaptcha-response"];
Oczywiście token to nie wszystko. Potrzebujemy jeszcze wprowadzić tajny klucz:
$secret = "tajny_klucz_reCAPTCHA";
oraz opcjonalnie: adres IP klienta:
$ip = $_SERVER["REMOTE_ADDR"];
Weryfikacji w API możemy dokonać pod adresem: https://www.google.com/recaptcha/api/siteverify
Strona ta przyjmuje parametry: secret, response i remoteip. Sklejamy zatem URL z naszych zmiennych, wykonujemy zapytanie za pomocą wygodnej funkcji file_get_contents() a odpowiedź w JSON dekodujemy do zmiennej PHP:
$url = "https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$token."&remoteip=".$ip; $request = file_get_contents($url); $response = json_decode($request);
W odpowiednim momencie wystarczy teraz sprawdzić czy zmienna success ma wartość true:
if($response->success){
/* Kontynuj działanie skryptu */
} else {
die("Nieprawidłowa odpowiedź CAPTCHA");
}
Podsumowanie
Jak widać integracja aplikacji z reCAPTCHA to nic trudnego i zadanie na kilka minut pracy. Każdy istniejący serwis napisany w PHP, który zawiera formularz kontaktowy, system rejestracji i logowania bądź całkiem inne funkcjonalności narażone na SPAM i ataki brute-force można zabezpieczyć za pomocą tej metody.
Źródła
- https://www.google.com/recaptcha/about/
- https://developers.google.com/recaptcha/docs/v3,
- https://developers.google.com/recaptcha/docs/verify
Odpowiedz lub skomentuj