Как использовать reCAPTCHA на самописном сайте?

В этом посте постараюсь максимально подробно рассказать о том как прикрутить капчу reCAPTCHA к своему самописному сайту. Это довольно не сложно, но всё же я решил посвятить этому топик в своём блоге ибо на официальном сайте reCAPTCHA вся документация только на английском языке, думаю будет не лишним перевести её и на русский. По сему могу заверить, что данная статья не столько мои рассуждения и поучения, сколько перевод официальной документации reCAPTCHA. Опять же повторюсь, что статья содержит информацию сугубо о том как использовать captcha reCAPTCHA на своём именно самописном сайте т.к. для большинства популярных CMS на официальном сайте проекта есть соответствующие плагины для быстрой интеграции, мы же будем всё писать вручную в своих исходниках на PHP.

Что такое captcha?

Как я и люблю, будем делать всё по порядку, точнее начнём издалека. Для начала определимся, что такое captcha? CAPTCHA (аббревиатура от англ. Completely Automated Public Turing test to tell Computers and Humans Apart, что в переводе «полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей», по русски КАПЧА) это автоматически генерируемый компьютерный тест, используемый для того, чтобы определить, кем является пользователь: человеком или машиной. Сам термин появился в 2000 году, в рунете устоялось название капча. Основная идея теста: предложить пользователю такую задачу, которую с лёгкостью может решить человек, но которую несоизмеримо сложнее решить компьютеру. Обычно это различное начертание шрифтов с разными шумами и помехами, которые затрудняют понимание машине.

Существует огромное количество различных готовых плагинов CAPTCHA реализованных на множествах языках программирования, в том числе и на PHP. Мы же остановимся на готовом решении от Google под названием reCAPTCHA. Он очень простой, гибкий, крайне популярный и надёжный в отношении защиты, а так же помогает оцифровывать печатные издания. Одним словом, reCAPTCHA своё дело знает, о нём, как известно из названия статьи, и пойдёт речь.

В общем с терминологией более мене разобрались, выбрали лучшее из готовых решений, время для самого интересного — подключение reCAPTCHA к своему сайту.

Использование reCAPTCHA с PHP

Пару слов именно о этом продукте, по словам с официального веб сайта проекта. reCAPTCHA это PHP библиотека обеспечивающая простой путь реализации CAPTCHA на твоём PHP веб сайте, помогающая остановить злоупотребления ботов. Библиотека обёрнутая в reCAPTCHA API.

Для использования reCAPTCHA с PHP ты должен сперва скачать массив под названием reCAPTCHA PHP
library с официального сайта проекта, там всегда последняя версия, поэтому лучше качать прямиком оттуда. Тебе нужен только один файл — recaptchalib.php. Другие файлы архива являются примерами, а так же описаниями и лицензиями.

Быстрый старт

Регистрируйся на сайте проекта и получи свои уникальные ключи для плагина. После получения API ключей, можешь продолжать читать далее. Ниже расположена базовая инструкция для установки reCAPTCHA на твой сайт.

Клиентская сторона (Как сделать показ изображения CAPTCHA)

Если ты хочешь использовать PHP библиотеку для отображения reCAPTCHA виджета, то тебе надо вставить следующий отрывок кода внутрь <form> элемента где reCAPTCHA виджет должен располагаться:

require_once('recaptchalib.php'); //подключаем reCAPTCHA библиотеку
$publickey = "твой_публичный_ключ"; // ты получил этот ключ на странице входа
echo recaptcha_get_html($publickey); //метод получения html кода reCAPTCHA виджета клиентской строны

С кодом, твоя форма должна выглядеть примерно так:

  <html>
    <body><!-- the body tag is required or the CAPTCHA may not show on some browsers -->
      <!-- your HTML content -->

      <formmethod="post"action="verify.php">
        <?php
          require_once('recaptchalib.php');
          $publickey ="your_public_key";// you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?>
        <inputtype="submit"/>
      </form>

      <!-- more of your HTML content -->
    </body>
  </html>

Не забывай установить $publickey путём замены твой_публичный_ключ на твой API публичный ключ.

Обратите внимание, что значение атрибута «action» установлено в «verify.php». Теперь, verify.php является файлом назначения (обработчиком формы), которому значения этой формы представляются после нажатия кнопки отправки формы. Таким образом, вы будете нуждаться в файле verify.php в том же директории, что и клиент HTML.

Функция require_once, в приведенном выше примере, ожидает, что файл recaptchalib.php будет в том же самом каталоге, что и файл формы. Если он находится в другом каталоге, то необходимо связать его соответствующим образом. Например, если ваш recaptchalib.php находится в каталоге под названием «captcha», который находится на том же уровне, как ваш файл формы, функция будет выглядеть следующим образом: require_once('captcha/recaptchalib.php');.

Серверная сторона (Как проверить, если пользователь ввел правильный ответ)

Следующий код должен находится вверху verify.php файла:

  <?php
  require_once('recaptchalib.php');
  $privatekey ="your_private_key";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

  if(!$resp->is_valid){
    // What happens when the CAPTCHA was entered incorrectly
    die("The reCAPTCHA wasn't entered correctly. Go back and try it again.".
         "(reCAPTCHA said: ". $resp->error .")");
  }else{
    // Your code here to handle a successful verification
  }
  ?>

В коде выше:

  • recaptcha_check_answer возвращает объект, который представляет успешно ли пользователь ввёл код.
  • Если $resp->is_valid true, то вызов Captcha был правильно заполнен и вы должны продолжать с обработкой формы.
  • Если $resp->is_valid false, то пользователь был не в состоянии ввести правильный текст, и вы должны снова отобразить форму, чтобы позволить ему еще одну попытку. В этом случае $resp->error будет кодом ошибки, который может быть предоставлен в recaptcha_get_html.
    Код ошибки производит управление reCAPTCHA и позволяет отобразить сообщение о том, что пользователь неправильно ввел текст и должен попробовать еще раз.

Обратите внимание, что код приватного ключа (private key), не следует путать с кодом открытого ключа (public key), не смотря на то, что вы получаете их на одной странице регистрации плагина.

Также убедитесь, что ваша форма работает, чтобы получить переменные формы, используя супер глобальный $_POST массив, вместо того, чтобы использовать массив $_REQUEST, и что сама форма использует метод POST.

Вот и все! reCAPTCHA теперь должна работать на вашем сайте, благодарю за внимание. Надеюсь говорить о том, что у вашего веб сервера должен быть постоянный доступ к reCAPTCHA серверам, говорить не надо ибо и так понятно.