rc.ws-a.ru · внутренний сервис

Подключение ALTCHA

Замена reCAPTCHA на своём сервере. Посетитель ничего не разгадывает — браузер молча решает счётную задачу. Ни cookies, ни обращений к Google.

Как это устроено

Сервис поднят на rc.ws-a.ru. Он выдаёт задачи и проверяет ответы — сайту остаётся вставить виджет в форму и один раз спросить сервис «решение верное?».

Библиотеку ALTCHA не ставили на сами сайты намеренно: она требует PHP 8.1, а из 478 сайтов ему соответствуют пять. 259 работают на 7.1, 93 на 5.6, 88 на 7.4. Через сервис подключается что угодно начиная с PHP 5.3.

АдресНазначение
rc.ws-a.ru/altcha.jsвиджет, подключается обычным <script>; русский язык встроен
rc.ws-a.ru/challengeвыдаёт задачу браузеру, открыт для всех сайтов
rc.ws-a.ru/verifyпроверяет решение; принимает запросы только с наших серверов
rc.ws-a.ru/demo.phpрабочая форма — можно потрогать до внедрения
rc.ws-a.ru/altcha-client.txtготовый PHP-файл проверки, скачать и положить на сайт
1

Виджет в форму

Скрипт подключается один раз на страницу, элемент ставится внутрь <form> — обычно перед кнопкой отправки.

<!-- один раз на страницу, можно в шапку или подвал -->
<script defer src="https://rc.ws-a.ru/altcha.js"></script>

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

  <altcha-widget challengeurl="https://rc.ws-a.ru/challenge"></altcha-widget>

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

Виджет сам добавит в форму скрытое поле altcha — его и проверяет второй шаг. Больше ничего в вёрстке менять не нужно.

Язык. Виджет берёт его из <html lang="ru">, а если атрибута нет — из настроек браузера. Задать принудительно: <altcha-widget ... strings='{"label":"Я не робот"}'>.
Кэш. Файл виджета браузеры держат час. Если после обновления на сайте видно старое поведение — обновите страницу с Ctrl+F5.
2

Проверка на сервере

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

Скачайте altcha-client.txt, положите рядом с обработчиком формы под именем altcha-client.php и вызовите проверку первой строкой — до отправки письма, до записи в базу, до всего остального.

<?php
require_once __DIR__ . '/altcha-client.php';

if (!altcha_check()) {
    // не подтверждено — показываем форму снова с сообщением
    exit('Подтвердите, что вы не робот.');
}

// дальше обычная обработка формы

Функция сама берёт поле из $_POST и обращается к сервису. Ей не нужны ключи и настройки. Если форма собирает данные иначе, значение можно передать явно: altcha_check($payload).

Что отвечает сервис

{"ok":true}решение верное — форму можно обрабатывать
"error":"empty"поле altcha не пришло: виджет не вставлен или форма отправлена в обход
"error":"invalid"подпись не наша, ответ подделан или задача просрочена (срок 10 минут)
"error":"already_used"это решение уже принимали — повторную отправку сервис не пропускает
"error":"forbidden"запрос пришёл с адреса вне списка разрешённых

Проверять эти коды в коде сайта не нужно — altcha_check() возвращает просто «да» или «нет». Они пригодятся, если что-то не работает.

Куда вставлять на разных движках

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

MODX Revolution
Формы почти всегда на FormIt. Проверка вешается отдельным сниппетом-хуком в &hooks, первым в списке — если сниппет вернёт false, FormIt дальше не пойдёт и покажет форму заново.
MODX Evolution
Обработчик — сниппет формы (обычно eForm или самописный). Вставлять в его код, до отправки письма. Не забыть, что у Evolution свой белый список имён сайта в assets/cache/siteHostnames.php — к капче отношения не имеет, но при переносе форм всплывает.
WordPress
Зависит от плагина. У Contact Form 7 — фильтр wpcf7_validate, у остальных ищите их хук валидации. Для форм, вшитых в тему, — в файл обработчика темы.
Bitrix
Если форма сделана модулем форм — в обработчик события перед сохранением результата. Если это компонент или самописный ajax.php — прямо в него, первой строкой.
Joomla, Webasyst
В обработчик того расширения, которое принимает форму. Универсального места нет, но принцип тот же: проверка идёт раньше любой полезной работы.
Самописные формы
Самый простой случай — require_once и if в начале файла, который принимает POST.

Как убрать reCAPTCHA

Сейчас её тянут 513 сайтов. Убирать нужно с обеих сторон, иначе останется либо мёртвая картинка, либо дыра в проверке.

В шаблоне удалить <script> с google.com/recaptcha и блок <div class="g-recaptcha">, на их место поставить код из шага 1. В обработчике удалить запрос к siteverify и проверку g-recaptcha-response, на их место — код из шага 2. Ключи sitekey и secret после этого нигде не нужны.

Не оставляйте старую проверку «на всякий случай». Поля g-recaptcha-response в форме больше не будет, и старый код начнёт отклонять все отправки.

Настройки, которые могут понадобиться

Поведение при недоступности сервиса

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

define('ALTCHA_FAIL_OPEN', true);
require_once __DIR__ . '/altcha-client.php';

Внешний вид виджета

Полезные атрибуты: hidefooter убирает подпись снизу, hidelogo — логотип, floating показывает виджет всплывающим у кнопки вместо блока в форме, auto="onsubmit" запускает проверку в момент отправки, а не при загрузке страницы.

Сложность задачи

Сейчас 1 000 000 вариантов — около секунды на телефоне, незаметно на компьютере. Меняется на сервере в одном месте, для всех сайтов сразу; правки на сайтах при этом не нужны.

Если не работает

Виджет не появился
Проверьте, что скрипт подключается и не блокируется. Элемент <altcha-widget> должен быть внутри формы.
Форма не отправляется даже после проверки
Скорее всего, обработчик получает пустое поле: убедитесь, что виджет стоит внутри той же <form>, которая отправляется, и что форма уходит методом POST.
Всегда «Подтвердите, что вы не робот»
Откройте rc.ws-a.ru — там видно, доступно ли хранилище. Если сайт живёт не на наших двух серверах, его адрес нужно добавить в список разрешённых для /verify.
Хочется проверить, что сервис вообще жив
Форма на rc.ws-a.ru/demo.php — это те же самые два шага, работающие вживую.