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

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

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

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

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

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

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

Правило приёма одно: заявка идёт дальше, только если success равен true, а домен в ответе — ваш. Всё остальное — отказ, включая случай «ответ не разобрался». Отсутствие поля с токеном в запросе — тоже отказ, а не повод пропустить проверку.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Бесплатный тариф — один сайт, без лимита на запросы. Несколько сайтов — тариф Pro в Stitex Shield: 1990 ₽ в месяц, до 10 сайтов. Ключи, код виджета и адрес проверки токена — на странице Stitex Captcha. Данные посетителей мы не передаём третьим лицам.

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

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

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

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

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

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

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

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

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

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

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

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

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

Контакты

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

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

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