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

Какие варианты reCAPTCHA v2 существуют
При создании ключа для сайта обычно рассматривают два самых популярных сценария:
- reCAPTCHA v2 Checkbox — классическая капча с флажком «Я не робот»;
- Invisible reCAPTCHA — проверка запускается без постоянного видимого чекбокса, обычно при отправке формы.
Если вам нужен максимально понятный интерфейс для пользователя и минимальный риск путаницы при внедрении, обычно проще начать именно с Checkbox v2. Если важнее аккуратный интерфейс и меньше визуального шума — можно использовать Invisible reCAPTCHA.
С чего начать: создаём ключи в Google reCAPTCHA
Для установки reCAPTCHA сначала нужно зарегистрировать сайт и получить два ключа:
- Site key — публичный ключ для клиентской части;
- Secret key — секретный ключ для проверки ответа на сервере.
При создании ключа:
- укажите название проекта или сайта;
- выберите тип reCAPTCHA;
- добавьте домены, на которых будет работать капча;
- сохраните ключи отдельно для фронтенда и бэкенда.
Критично: 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, логированием и дополнительной серверной антибот-логикой.
голосов
Следующие страницы вас также могут заинтересовать:
- Настройка Cloudflare для защиты и оптимизации сайта
- Робототехника
- Калькулятор конверсии онлайн | Расчет конверсии сайта
- SEO умного фильтра Bitrix
- Total SEO - Полный практический гайд по продвижению сайтов от Шаминой и Носаченко
Обновлено: 25.03.2026