Google udostępnia swój mechanizm zabezpieczania formularzy przed robotami spamującymi. Jednak, aby go zastosować w formularzu musimy się trochę nagimnastykować.
- Na swoim koncie (Google) tworzymy zabezpieczenie reCaptcha v2, wpisujemy adres zabezpieczanej strony (sama domena) i otrzymujemy dwa kody: publiczny i prywatny
1https://www.google.com/recaptcha/admin
- W sekcji HEAD na stronie z formularzem umieszczamy bibliotekę JS:
1<script src='https://www.google.com/recaptcha/api.js'></script> <!--recaptcha google-->
- W formularzu typu POST (wewnątrz FORM, przed przyciskiem SUBMIT) umieszczamy kod
1<div class="g-recaptcha" data-sitekey="klucz_publiczny_od_Google"></div>
- Teraz przechodzimy do sprawdzania formularza w PHP, tam przy sprawdzaniu formularza wpisujemy poniższy kod, podmieniamy jedynie twoj_klucz_prywatny_od_Google na otrzymany na swoim koncie przy zakładaniu reCaptcha.
Skrypt pobiera z formularza zmienną POST g-recaptcha-response (jej brak oznacza, że nie kliknięto reCaptcha), a następnie porównuje czy klucze pasują do siebie wysyłając zapytanie POST do serwera Google.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | if (!isset($_POST["g-recaptcha-response"]) || $_POST["g-recaptcha-response"]=="") die ("Nie kliknięto pola reCAPTCHA na dole formularza!"); $url = 'https://www.google.com/recaptcha/api/siteverify'; //Google skrypt sprawdzający captcha $data = array( 'secret' => 'twoj_klucz_prywatny_od_Google', 'response' => $_POST["g-recaptcha-response"], 'remoteip' => $_SERVER["REMOTE_ADDR"] ); // trzeba wpisać 'http' nawet, jeśli wysyłamy https://... $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); //odp na POST z serwera Google if ($result === FALSE) { //błąd połączenia //debug: var_dump($result); die ("Błąd nr 1! Zły kod captcha"); } $odp= json_decode($result, true); //zmienna postaci { "success": true, "challenge_ts": "2017-07-22T20:07:58Z", "hostname": "fx-team.fulara.com" } if (!$odp["success"]) //zmienna bool == true { //var_dump($result); die ("Błąd nr 2! Zły kod captcha, kod błędu: ".$odp["error-codes"][0]); } |