Stitex Technologies

Безопасность

REST API капчи: как проверить токен на сервере

Короткий ответ: виджет кладёт в форму токен, а проверяет его ваш сервер — POST-запросом к сервису капчи с приватным ключом сайта и этим токеном. Заявка обрабатывается, только если пришёл ответ с успехом; токен одноразовый и живёт недолго. Разбираем, из чего складывается цена такой проверки и чем оборачивается экономия на ней.

3 сентября 20268 минутStitex Technologies

Что именно проверяет сервер

Виджет на странице наблюдает за поведением посетителя и кладёт в форму токен решения — строку, которая означает «эту отправку проверяли». Сама по себе она ничего не гарантирует: браузером управляет посетитель, а бот страницу может вообще не открывать. Поэтому токен отдаётся на проверку с вашего сервера на сервер капчи, и уже ответ определяет судьбу заявки.

ЧтоЗначение
Метод и адресPOST на адрес проверки сервиса, из вашего бэкенда
Тело запросаsecretKey — приватный ключ сайта, solveToken — токен из формы
Необязательноидентификатор сессии — если на сайте работает наш антифрод, в ответ добавится оценка сессии
ОтветJSON: success, отметка времени токена, домен из вашего ключа; при отказе — поле error с причиной

Правило приёма одно: заявка идёт дальше, только если success равен true. Своих сверок к этому флагу добавлять не нужно. Просрочку токена и повторное предъявление того же токена отбивает сама проверка: оба случая возвращаются отказом, причина названа в поле error. Запрос без поля с токеном — тоже отказ, а не повод пропустить проверку. Точные параметры и пример ответа — в документации: серверная верификация токена.

Исходов у проверки три, и третий надо задать явно. Успех — заявка принята. Отказ проверки — заявка отклонена. Ответа нет или он не разобрался — таймаут, обрыв, страница ошибки вместо JSON — это ни успех, ни отказ, а третий исход: проверить не удалось. Проверенной такая заявка не считается никогда. Её либо отклоняют с понятным сообщением, либо принимают помеченной и отправляют на ручной разбор. Молчаливый пропуск в общем try/catch — не вариант ни для одной формы.

Приватный ключ живёт только на сервере
Site Key стоит в HTML и виден всем — так и задумано. Secret Key не должен попадать ни в JavaScript, ни в мобильное приложение, ни в публичный репозиторий: с ним чужой сервер проверяет токены от вашего имени. Хранить его надо там же, где пароль от базы данных.

Из чего складывается цена

Считать стоит не «сколько стоит капча», а во что обходится закрытая форма целиком. Строк пять: три разовые, две регулярные.

СтатьяРазовая / регулярнаяОт чего зависит
Сам сервис капчирегулярнаячисло сайтов; на бесплатном тарифе — один
Виджет на страницыразоваясколько шаблонов правится
Проверка токена в бэкендеразоваясколько разных обработчиков принимают формы
Обработка отказа и журнал у себяразоваянужен ли разбор причин отказов
Ожидание ответа сервисарегулярнаядобавляется ко времени отправки формы

Разброс цены даёт третья строка. Виджет ставится одной правкой шаблона. Проверка — это код в каждом месте, где сервер принимает форму: обратный звонок, заявка с карточки товара, регистрация, комментарий. Сколько обработчиков принимают формы, столько будет и проверок: одна форма — одна правка, десяток разрозненных обработчиков — десять. Отдельная работа — найти их все; пока список точек приёма не составлен, смету считать не на чем.

Строка, на которой экономят

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

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

Одна сэкономленная строка сметы возвращается двумя расходами: разбором мусорных заявок и временем на поиск причины. Чем невидимая защита отличается от картиночной и почему она не бьёт по конверсии — в разборе невидимая капча: защита форм и логина от ботов. Выбор между двумя вариантами — в статье невидимая капча против обычной.

Что удорожает внедрение

  • Секретный ключ попал во фронтенд: перевыпуск пары ключей плюс повторная раскатка кода,
  • Проверка стоит на одной форме из нескольких: остальные обработчики принимают заявки без неё,
  • Третий исход не задан: при недоступности сервиса форма молча пропускает всех — ветка не выбрана, а просто не написана,
  • Ответ проверки нигде не сохраняется, и на вопрос «почему заявка не дошла» отвечать нечем,
  • Токен проверяется не в момент приёма формы, а после очереди — к этому времени он уже просрочен.

На готовой CMS часть работы берёт на себя плагин формы. Делает ли он проверку на сервере — вопрос к его настройкам и коду: это стоит открыть и посмотреть, а не считать сделанным. Заодно проверяются и остальные точки входа: защита WordPress от взлома.

Приёмка: два запроса

Проверить, что работа сделана, можно без доступа к коду. Отправьте на обработчик формы запрос без поля с токеном — сервер обязан отказать. Затем отправьте с произвольной строкой вместо токена — отказ должен повториться. Если хотя бы в одном случае заявка создалась и упала в почту, серверной проверки нет, сколько бы виджетов ни стояло на страницах.

Сколько стоит сам сервис

Бесплатный тариф — один сайт, без лимита на запросы. Тариф Pro в Stitex Shield — 1990 ₽ в месяц: до 10 сайтов, ML-скоринг ботов, гео-аналитика, алёрты на атаки. Граница проходит по двум признакам: сайтов больше одного или нужна одна из этих функций. Что именно входит в бесплатный тариф — в разборе бесплатная капча: что входит. Ключи и код виджета — на странице Stitex Captcha. Данные посетителей мы не передаём третьим лицам.

Частые вопросы

Можно ли проверить токен прямо в браузере?

Нет. Всё, что происходит на странице, посетитель может изменить, а бот — просто не выполнять. Поле с токеном подделывается так же легко, как любое другое поле формы, поэтому решение «принять или отклонить» принимает только ваш сервер по ответу сервиса капчи.

Что приходит в ответе, если токен не прошёл?

Ответ с отказом и полем error, где названа причина: токен просрочен, уже был использован, не того формата, приватный ключ неверный. Код должен различать отказ проверки и недоступность самого сервиса — это разные ситуации с разным поведением.

Сколько живёт токен и можно ли использовать его дважды?

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

Что делать, если сервис проверки недоступен?

Записать этот исход в коде отдельной веткой. «Ответа нет» и «ответ не разобрался» — один и тот же случай: проверить не удалось. Проверенной такая заявка не считается ни на одной форме: её либо отклоняют с понятным сообщением, либо принимают помеченной и отправляют на ручной разбор. Цена ошибки влияет только на выбор между этими двумя путями, а не на право пропустить заявку молча.

Нужен ли отдельный ключ на каждый сайт?

Да, пара ключей выдаётся на домен. Site Key стоит в HTML и виден всем, Secret Key живёт только на сервере. Домен в ответе проверки — это домен, записанный за вашим ключом, а не свойство токена, поэтому решение о приёме принимается по флагу success, а не сверкой домена.

Подключим капчу с серверной проверкой

Виджет на формы, ключи на домен и проверка токена в вашем бэкенде. Данные посетителей на сторону не уходят.

Контакты

Спросите нас по теме статьи

Опишите свою ситуацию — скажем, что из этого применимо у вас, а что нет. Без обязательств.

Telegram
@StitexBot
Отвечаем
В течение рабочего дня

Работа с юрлицами и ИП:

  • Все цены включают НДС 22%
  • Договор, акты и счета по ЭДО или с УПД
  • Гарантия на все выполненные работы — 3 месяца