Google reCAPTCHA v2: установка на сайт через HTML и PHP

Обновлено: 25.03.2026 14568

Как установить Google reCAPTCHA v2 на сайт через HTML и PHP: пошаговое подключение, серверная проверка, Checkbox и Invisible reCAPTCHA, типовые ошибки и защита форм от спама.

Установка Google reCAPTCHA v2 на сайт: HTML, PHP и защита форм

Время прочтения:

Google reCAPTCHA v2 — один из самых простых и понятных способов защитить формы на сайте от автоматического спама, мусорных заявок, примитивных ботов и массовых отправок через скрипты. Даже если у вас небольшой сайт, лендинг, форма обратной связи, регистрация, комментарии или заявка на консультацию, отсутствие базовой антибот-защиты почти всегда рано или поздно приводит к лишнему мусору.

В этой статье разберём, как правильно установить reCAPTCHA v2 на сайт, как подключить её в клиентской части, как проверить ответ на стороне сервера через PHP и какие ошибки чаще всего мешают нормальной работе капчи.

Важно: в материале ниже мы говорим именно про reCAPTCHA v2 — классический виджет с чекбоксом «Я не робот», а также про Invisible reCAPTCHA. Для большинства обычных форм это до сих пор один из самых практичных вариантов.

Google reCAPTCHA v2: установка на сайт через HTML и PHP

Какие варианты reCAPTCHA v2 существуют

При создании ключа для сайта обычно рассматривают два самых популярных сценария:

  • reCAPTCHA v2 Checkbox — классическая капча с флажком «Я не робот»;
  • Invisible reCAPTCHA — проверка запускается без постоянного видимого чекбокса, обычно при отправке формы.

Если вам нужен максимально понятный интерфейс для пользователя и минимальный риск путаницы при внедрении, обычно проще начать именно с Checkbox v2. Если важнее аккуратный интерфейс и меньше визуального шума — можно использовать Invisible reCAPTCHA.

С чего начать: создаём ключи в Google reCAPTCHA

Для установки reCAPTCHA сначала нужно зарегистрировать сайт и получить два ключа:

  • Site key — публичный ключ для клиентской части;
  • Secret key — секретный ключ для проверки ответа на сервере.

При создании ключа:

  1. укажите название проекта или сайта;
  2. выберите тип reCAPTCHA;
  3. добавьте домены, на которых будет работать капча;
  4. сохраните ключи отдельно для фронтенда и бэкенда.

Критично: Secret key нельзя выводить в HTML, JavaScript или отдавать на клиент. Он должен использоваться только на серверной стороне.

Когда reCAPTCHA действительно нужна

Подключать капчу особенно полезно на следующих элементах сайта:

  • форма обратной связи;
  • форма заказа звонка;
  • заявка на консультацию;
  • регистрация и логин;
  • комментарии и отзывы;
  • формы отправки сообщений, заявок и обращений;
  • публичные AJAX-обработчики, через которые можно массово слать запросы.

Если форма доступна без дополнительной защиты, её очень быстро начинают использовать спам-боты. Даже если на сайте пока всё спокойно, отсутствие антибот-проверки — это скорее вопрос времени.

Клиентская часть: подключаем reCAPTCHA v2 Checkbox

Самый простой и надёжный вариант — классическая Checkbox reCAPTCHA. Сначала подключаем JS Google:

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

Затем вставляем виджет внутрь формы:

<form method="post" action="/contact/send.php">
    <input type="text" name="name" required>
    <input type="email" name="email" required>
    <textarea name="message" required></textarea>

    <div class="g-recaptcha" data-sitekey="ВАШ_SITE_KEY"></div>

    <div class="form-error" id="recaptchaError"></div>

    <button type="submit">Отправить</button>
</form>

После этого на странице появится стандартный блок Google reCAPTCHA. При отправке формы браузер добавит в POST-параметры поле g-recaptcha-response.

Серверная проверка: как делать правильно

Самая важная часть — это проверка ответа на сервере. Просто показать виджет на странице недостаточно. Если не проверить токен в PHP, защиту можно обойти отправкой прямого запроса в обработчик формы.

В старых примерах часто встречается слишком упрощённый вариант через file_get_contents(). Он может работать, но для боевого проекта лучше использовать более аккуратную схему с POST-запросом, таймаутами, проверкой ответа и обработкой ошибок.

Пример безопасной проверки в PHP

<?php
declare(strict_types=1);

function verifyRecaptchaV2(string $token, string $secretKey, ?string $remoteIp = null): array
{
    if ($token === '') {
        return [
            'ok' => false,
            'message' => 'Не получен токен reCAPTCHA.',
            'data' => null,
        ];
    }

    $postFields = [
        'secret' => $secretKey,
        'response' => $token,
    ];

    if ($remoteIp !== null && $remoteIp !== '') {
        $postFields['remoteip'] = $remoteIp;
    }

    $ch = curl_init('https://www.google.com/recaptcha/api/siteverify');

    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($postFields),
        CURLOPT_TIMEOUT => 10,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
    ]);

    $responseBody = curl_exec($ch);
    $curlError = curl_error($ch);
    $httpCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($responseBody === false || $curlError !== '') {
        return [
            'ok' => false,
            'message' => 'Не удалось выполнить запрос к Google reCAPTCHA.',
            'data' => null,
        ];
    }

    if ($httpCode < 200 || $httpCode >= 300) {
        return [
            'ok' => false,
            'message' => 'Google reCAPTCHA вернула неожиданный HTTP-статус.',
            'data' => null,
        ];
    }

    $data = json_decode($responseBody, true);

    if (!is_array($data)) {
        return [
            'ok' => false,
            'message' => 'Не удалось разобрать ответ Google reCAPTCHA.',
            'data' => null,
        ];
    }

    if (!empty($data['success'])) {
        return [
            'ok' => true,
            'message' => 'Проверка reCAPTCHA успешно пройдена.',
            'data' => $data,
        ];
    }

    $errors = isset($data['error-codes']) && is_array($data['error-codes'])
        ? implode(', ', $data['error-codes'])
        : 'unknown_error';

    return [
        'ok' => false,
        'message' => 'Проверка reCAPTCHA не пройдена: ' . $errors,
        'data' => $data,
    ];
}

Пример использования в обработчике формы

<?php
declare(strict_types=1);

$secretKey = 'ВАШ_SECRET_KEY';
$token = trim((string)($_POST['g-recaptcha-response'] ?? ''));
$remoteIp = $_SERVER['REMOTE_ADDR'] ?? '';

$result = verifyRecaptchaV2($token, $secretKey, $remoteIp);

if (!$result['ok']) {
    http_response_code(422);
    echo 'Ошибка проверки reCAPTCHA: ' . $result['message'];
    exit;
}

// Здесь продолжается обработка формы:
// валидация полей, отправка письма, запись в CRM и т.д.

echo 'Форма успешно отправлена.';

Почему важно проверять не только success

Во многих старых примерах проверка ограничивается только тем, что токен не пустой и запрос к Google вернул какой-то JSON. Но для нормальной серверной логики нужно ориентироваться хотя бы на несколько вещей:

  • есть ли в ответе success = true;
  • нет ли error-codes;
  • при необходимости совпадает ли hostname с вашим сайтом;
  • не истёк ли токен и не использован ли он повторно.

Это особенно важно, если вы защищаете не просто форму комментариев, а чувствительные сценарии: регистрацию, личный кабинет, форму логина, заявки или финансовые действия.

Важно: токен reCAPTCHA не живёт бесконечно. Его нужно проверять быстро, сразу в процессе отправки формы. Если пользователь слишком долго сидел на странице, капча может стать невалидной и потребовать повторной проверки.

Как вывести понятную ошибку пользователю

В старых статьях часто используют жёсткий вывод ошибки через inline JavaScript прямо из PHP. Такой способ работает, но выглядит грубо и плохо масштабируется. Лучше возвращать аккуратную ошибку либо в HTML, либо в JSON — в зависимости от того, обычная у вас форма или AJAX.

Простой HTML-вариант

<?php if (!empty($formError)): ?>
    <div class="form-error"><?= htmlspecialchars($formError, ENT_QUOTES, 'UTF-8') ?></div>
<?php endif; ?>

Если форма AJAX

<?php
http_response_code(422);
header('Content-Type: application/json; charset=UTF-8');

echo json_encode([
    'success' => false,
    'message' => 'Подтвердите, что вы не робот.',
], JSON_UNESCAPED_UNICODE);

Такой подход намного чище, чем вставлять HTML-фрагменты в JavaScript-строку прямо из PHP.

Пример Invisible reCAPTCHA

Если вы не хотите постоянно показывать чекбокс, можно использовать Invisible reCAPTCHA. В этом режиме проверка привязывается к кнопке отправки формы.

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<form action="/contact/send.php" method="post">
    <input type="text" name="name" required>
    <input type="email" name="email" required>
    <textarea name="message" required></textarea>

    <button
        class="g-recaptcha"
        data-sitekey="ВАШ_SITE_KEY"
        data-callback="onSubmit"
        data-action="submit">
        Отправить
    </button>
</form>

<script>
function onSubmit() {
    document.forms[0].submit();
}
</script>

Серверная проверка при этом остаётся той же самой: вы всё равно обязаны проверить g-recaptcha-response через backend.

CSS: как аккуратно оформить блок капчи

Если нужно просто выровнять reCAPTCHA по центру формы, можно использовать такой стиль:

.recaptcha-wrap {
    margin-top: 16px;
    display: flex;
    justify-content: center;
}

.form-error {
    margin-top: 12px;
    color: #c62828;
    font-size: 14px;
    text-align: center;
}

Тогда HTML-блок внутри формы будет выглядеть так:

<div class="recaptcha-wrap">
    <div class="g-recaptcha" data-sitekey="ВАШ_SITE_KEY"></div>
</div>
<div class="form-error" id="recaptchaError"></div>

Типовые ошибки при установке reCAPTCHA v2

  • подключили виджет на странице, но не сделали серверную проверку;
  • используют Secret key в клиентском коде;
  • не добавили нужный домен в настройках ключа;
  • проверяют только наличие токена, а не результат success;
  • не обрабатывают ошибки Google и не логируют неудачные ответы;
  • пытаются использовать старый ключ на другом домене или поддомене без настройки;
  • делают проверку слишком поздно, когда токен уже истёк;
  • возвращают пользователю непонятную ошибку или ломают UX формы.

Практический совет: если форма важная для бизнеса, не ограничивайтесь только капчей. Добавьте ещё серверную валидацию, honeypot-поле, rate limit, логирование и защиту от повторных отправок.

Когда reCAPTCHA v2 — хороший выбор, а когда лучше смотреть дальше

reCAPTCHA v2 хорошо подходит, если вам нужен понятный визуальный сценарий, быстрая интеграция и прогнозируемое поведение пользователя.

Но если у вас:

  • много чувствительных сценариев на сайте;
  • высокий уровень ботов и abuse-трафика;
  • регистрация, логин, личный кабинет, платежи;
  • нужна оценка риска без постоянного видимого челленджа,

тогда уже стоит смотреть в сторону более продвинутой антибот-архитектуры: reCAPTCHA v3, reCAPTCHA Enterprise, Cloudflare Turnstile, WAF, поведенческих проверок и комбинации нескольких уровней защиты.

Вывод

Google reCAPTCHA v2 — это всё ещё рабочий и практичный способ защитить формы на сайте от простых и средних по сложности ботов. Но реальная польза от неё появляется только тогда, когда вы внедряете её правильно: подключаете клиентскую часть, обязательно проверяете токен на сервере и аккуратно обрабатываете ошибки.

Если делать всё грамотно, reCAPTCHA v2 позволяет быстро сократить объём спама, снизить нагрузку на обработчики форм и убрать значительную часть мусорных заявок без тяжёлых доработок проекта.

FAQ

Достаточно ли просто вставить виджет reCAPTCHA в HTML?

Нет. Виджет на странице — это только клиентская часть. Обязательна серверная проверка токена через backend-запрос к Google.

Что лучше выбрать: Checkbox или Invisible reCAPTCHA?

Если нужен максимально понятный сценарий — Checkbox. Если важнее более чистый интерфейс и меньше визуальной нагрузки — Invisible reCAPTCHA.

Можно ли проверять reCAPTCHA через file_get_contents()?

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

Почему капча иногда не проходит, хотя пользователь реальный?

Причин может быть несколько: истёк токен, форма долго была открыта, ошибка домена, проблемы с JS, сетевые ограничения, блокировка сторонних скриптов или некорректная серверная обработка.

reCAPTCHA v2 решает все антибот-задачи?

Нет. Это хороший базовый слой защиты, но для более сложных сценариев его лучше комбинировать с rate limiting, honeypot, логированием и дополнительной серверной антибот-логикой.

Связаться в Telegram

Рейтинг: 2.2/5
5 голосов

Следующие страницы вас также могут заинтересовать:

Обновлено: 25.03.2026