rc.ws-a.ru · внутренний сервис
Замена 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-файл проверки, скачать и положить на сайт |
Скрипт подключается один раз на страницу, элемент ставится внутрь <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.Это обязательная часть. Виджет сам по себе ничего не защищает: бот просто не станет его выполнять и отправит форму напрямую. Пока сервер не проверил поле altcha, защиты нет.
Скачайте altcha-client.txt, положите рядом с обработчиком формы под именем altcha-client.php и вызовите проверку первой строкой — до отправки письма, до записи в базу, до всего остального.
<?php
require_once __DIR__ . '/altcha-client.php';
if (!altcha_check()) {
// не подтверждено — показываем форму снова с сообщением
exit('Подтвердите, что вы не робот.');
}
// дальше обычная обработка формы
Функция сама берёт поле из $_POST и обращается к сервису. Ей не нужны ключи и настройки. Если форма собирает данные иначе, значение можно передать явно: altcha_check($payload).
Проверять эти коды в коде сайта не нужно — altcha_check() возвращает просто «да» или «нет». Они пригодятся, если что-то не работает.
Правило одно для всех: найдите место, где форма обрабатывается на сервере, и поставьте проверку в самое начало. Ниже — где это место обычно находится.
&hooks, первым в списке — если сниппет вернёт false, FormIt дальше не пойдёт и покажет форму заново.assets/cache/siteHostnames.php — к капче отношения не имеет, но при переносе форм всплывает.wpcf7_validate, у остальных ищите их хук валидации. Для форм, вшитых в тему, — в файл обработчика темы.ajax.php — прямо в него, первой строкой.require_once и if в начале файла, который принимает POST.Сейчас её тянут 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./verify.