«Поставьте reCAPTCHA на форму» — типичная рекомендация из чеклиста безопасности. Через полгода владелец продукта спрашивает: почему счёт растёт, почему виджет не грузится у части пользователей в РФ, и зачем мы отправляем поведение посетителей в Google. В 2026 году «дорого» у капчи — не только про рубли за тысячу проверок. Это ещё юридические риски, лишний JavaScript, ложные срабатывания и зависимость от чужого SaaS.
Ниже — когда виджет действительно нужен, когда хватает более дешёвого контура, и какие альтернативы reCAPTCHA и Yandex SmartCaptcha мы используем в продуктах OtherCode — в том числе на othercode.ru, где форма заявки защищена локальной проверкой без сторонних скриптов.
Что значит «дорого»
| Измерение | reCAPTCHA / SmartCaptcha | Что бьёт по бюджету и нервам |
|---|---|---|
| Деньги | Бесплатный tier → платный при росте трафика | Всплески ботов, DDoS на форму, маркетинговая кампания |
| Юридика | Данные уходят провайдеру (Google — за рубеж) | 152-ФЗ, трансграничная передача, согласие в cookie-баннере |
| Доступность | Зависимость от CDN и API Google | Сбои и блокировки — см. Google в России |
| UX | Чекбокс, картинки, «подозрительный трафик» | Потеря заявок с мобильных, VPN, корпоративных прокси |
| Производительность | +100–300 KB JS, сторонние запросы | LCP, Core Web Vitals, SEO |
| Поддержка | Меняются правила v2/v3/Enterprise | Регрессии после обновления виджета |
«Дорого» часто наступает раньше, чем кажется: не когда миллион проверок в месяц, а когда юрист просит обновить политику ПДн, DevOps видит 503 от Google в production, а маркетинг теряет 15% лидов из-за невидимой капчи.
Нужна ли капча вообще
Капча — последний рубеж, не замена архитектуре. Перед выбором провайдера ответьте:
- Какой актив защищаем? Публичная форма «оставить заявку» ≠ регистрация с бонусом ≠ API без авторизации.
- Какой ущерб от спама? 10 писем в день в CRM — терпимо; 10 000 — уже инцидент.
- Есть ли аутентификация? Для логина важнее rate limit + MFA, чем капча на каждый ввод пароля.
- Можно ли отложить контакт? Double opt-in по email/SMS отсекает ботов без виджета.
| Сценарий | Капча обязательна? | Что обычно хватает |
|---|---|---|
| Контактная форма на лендинге | Редко | Honeypot + rate limit + время заполнения |
| Регистрация в SaaS | Часто | Виджет или подтверждение email/телефона |
| Восстановление пароля | Иногда | Rate limit по IP/email + одноразовая ссылка |
| Публичный API | Зависит | API keys, OAuth, WAF, квоты |
| Комментарии / UGC | Да при росте | Модерация + капча или trust score |
| B2G / госсектор | По ТЗ | Российский провайдер или self-hosted |
Если риск низкий — не платите ни деньгами, ни зависимостью. Сначала включите дешёвые слои.
Слои защиты без виджета
Рабочий минимум для корпоративного сайта и формы заявки:
1. Rate limiting
Ограничение запросов по IP (и по fingerprint сессии, если есть) на уровне nginx, API gateway или приложения. Для формы «5 отправок с одного IP за 15 минут» отсекает большую часть скриптового спама.
2. Honeypot
Скрытое поле, которое человек не видит, а бот заполняет. Нулевая стоимость, нулевой UX-штраф. В OtherCode поле _hp вынесено за экран и помечено aria-hidden.
3. Время жизни и «слишком быстрая» отправка
Форма, отправленная через 200 мс после загрузки страницы, — почти наверняка бот. Сервер выдаёт одноразовый challenge при открытии страницы и отклоняет токен, если между выдачей и submit прошло меньше порога (у нас — 2 секунды).
4. Одноразовый подписанный токен
Challenge подписывается HMAC на сервере, содержит nonce и TTL. Повторное использование токена блокируется — защита от replay.
5. Валидация и санитизация на сервере
Капча не спасёт от SQL-инъекций и XSS. Серверная валидация обязательна в любом случае — см. проектирование REST API.
6. Подтверждение канала
Для аккаунтов с ценностью (баланс, данные клиентов) — письмо или SMS-код важнее любой картинки с светофорами.
Браузер Ваш backend
| GET /api/captcha/challenge
| ------------------------> rate limit, выдать signed token
| <------------------------ { token }
|
| POST /api/contact + token + honeypot
| ------------------------> проверить подпись, TTL, nonce,
| honeypot, rate limit, время
| <------------------------ 200 / 429 / 403
Так устроена локальная капча на othercode.ru: без загрузки скриптов Google/Яндекса, без передачи поведения пользователя третьей стороне. Переключатель NEXT_PUBLIC_CAPTCHA_PROVIDER=none отключает проверку в dev; в production без CAPTCHA_SECRET отправка блокируется.
Этого достаточно для типичной B2B-формы с десятками–сотнями заявок в месяц. Для открытой регистрации с бонусами — обычно нет.
Когда виджет всё же нужен
Если боты целенаправленно обходят honeypot (headless Chrome, ручной фарм, LLM-агенты с задержками), подключайте challenge с доказательством «человечности»:
| Провайдер | Плюсы | Минусы |
|---|---|---|
| Yandex SmartCaptcha | РФ, знаком пользователям, API на русском | Платный рост, зависимость от Яндекса |
| Google reCAPTCHA v3 | Невидимая, привычная интеграция | Google, риски в РФ, false positive |
| Cloudflare Turnstile | Бесплатный tier, лёгкий виджет | Данные у Cloudflare, не всем подходит по compliance |
| hCaptcha | Privacy-ориентированность, enterprise | Доступность и оплата из РФ — проверять отдельно |
| Friendly Captcha | Proof-of-work в браузере | Платно, нагрузка на слабые устройства |
| mCaptcha (self-hosted) | Open source, свой сервер | Нужно администрировать |
Практика OtherCode: гибрид. Лендинг и «оставить заявку» — локальный контур. Регистрация в продукте заказчика с высоким abuse-потенциалом — SmartCaptcha или Turnstile только на этом endpoint, не на всём сайте.
Как снизить счёт, если остаётесь на Google / Яндексе
- Не вешайте капчу глобально — только POST на
/register,/forgot-password,/contact. - Порог score для reCAPTCHA v3 — не ставьте 0.9 «на всякий случай»; калибруйте по логам.
- Server-side verify всегда — токен с клиента без проверки на backend бесполезен.
- Кэш «доверенных» сессий — повторная отправка из той же сессии без повторного challenge (осторожно с abuse).
- Сначала rate limit — часть ботов отсечётся до платной проверки.
- Мониторинг — график
captcha_fail / submitпокажет атаку раньше счёта.
Выбор стратегии: таблица решений
| Профиль проекта | Рекомендация |
|---|---|
| Корпоративный сайт, форма заявки | Локальная капча + honeypot + rate limit |
| SaaS, freemium, реферальная программа | Виджет на регистрации + email verify |
| Госсектор / 152-ФЗ жёстко | SmartCaptcha или self-hosted, без Google |
| Высокий bot-трафик, DDoS на форму | WAF + виджет + очередь заявок |
| Мобильное приложение | Нативный SDK провайдера или свой attestation |
| Уже есть Cloudflare | Turnstile на формах, остальное — правила WAF |
Реализация в Next.js (схема)
Типовая структура для App Router:
src/app/api/captcha/challenge/route.ts — выдача signed token
src/lib/captcha-server.ts — verify на submit
src/hooks/useCaptchaToken.tsx — клиент: challenge + honeypot
src/app/api/contact/route.ts — форма вызывает verifyCaptcha()
Принципы:
- Секрет только на сервере —
CAPTCHA_SECRET, неNEXT_PUBLIC_*. - Провайдер как enum —
local | none | smartcaptcha(расширяемо без переписывания форм). - Единая функция
verifyCaptcha()для всех форм — контакты, вакансии, demo-request. - Логи без ПДн — писать
rate_limit,honeypot,expired, не email отправителя.
Подробнее про серверную часть Next.js — в статье про App Router. Про общий контур ИБ — кибербезопасность 2026.
Типичные ошибки
- Капча только на фронте — бот шлёт POST напрямую в API.
- Один ключ на dev и prod — утечка из репозитория компрометирует production.
- Капча вместо rate limit — платите за каждый запрос бота, который можно резать бесплатно.
- Invisible reCAPTCHA на каждой странице — лишний JS и ложные блокировки SEO-ботов (настройте исключения).
- Нет fallback — виджет не загрузился → пользователь не может отправить форму. Нужен запасной канал (email, телефон) или деградация с усиленным rate limit.
Чеклист перед сменой провайдера
- Зафиксировать baseline: заявок/день, % спама, стоимость проверок
- Оценить, нужен ли виджет или хватит локального контура
- Проверить политику ПДн и cookie-баннер под нового провайдера
- Вынести verify в один серверный модуль
- Нагрузочно протестировать rate limit (не DDoS-ить себя в prod)
- Заложить метрики:
challenge_issued,submit_blocked,submit_ok - Документировать для команды: когда включать
noneв staging
Итог
reCAPTCHA и SmartCaptcha — нормальный выбор, когда abuse реален и бюджет на проверки оправдан. Но для большинства корпоративных сайтов и форм «связаться с нами» они избыточны и действительно дороги — в широком смысле: деньги, зависимость, UX, compliance.
Сначала постройте слои: rate limit, honeypot, signed challenge, серверная валидация. Виджет подключайте точечно — на регистрацию и другие high-risk endpoints. Так вы платите провайдеру только за то, что не закрывается бесплатной инженерией.
Нужно спроектировать защиту форм, API или миграцию с Google reCAPTCHA? Оставьте заявку — OtherCode внедряет локальный контур и гибридные схемы под 152-ФЗ и ваш трафик.

