22 lipca 2017

reCaptcha w PHP – zabezpieczanie formularzy

Kategoria: PHP Autor: FX

Google udostępnia swój mechanizm zabezpieczania formularzy przed robotami spamującymi. Jednak, aby go zastosować w formularzu musimy się trochę nagimnastykować.

  1. Na swoim koncie (Google) tworzymy zabezpieczenie reCaptcha v2, wpisujemy adres zabezpieczanej strony (sama domena) i otrzymujemy dwa kody: publiczny i prywatny
    1
     https://www.google.com/recaptcha/admin
  2. W sekcji HEAD na stronie z formularzem umieszczamy bibliotekę JS:
    1
    <script src='https://www.google.com/recaptcha/api.js'></script> <!--recaptcha google-->
  3. W formularzu typu POST (wewnątrz FORM, przed przyciskiem SUBMIT) umieszczamy kod
    1
    <div class="g-recaptcha" data-sitekey="klucz_publiczny_od_Google"></div>
  4. 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]);
        }

Komentowanie wyłączone.