Все статьи

Защита веб-форм от спама — без cookies и зарубежных CAPTCHA-сервисов

Опубликовано

Любая контактная форма притягивает спам. Обычное решение — CAPTCHA крупного провайдера. Она отнимает у посетителей время, часто устанавливает cookies и загружает скрипты с серверов за рубежом — по законодательству Грузии это может быть передачей данных, требующей разрешения (подробнее).

Мы защищаем наши формы иначе: с помощью ALTCHA, метода proof-of-work, на собственном сервере.

Вычислительная задача вместо головоломки

При загрузке формы браузер получает небольшую вычислительную задачу и решает её в фоне, пока посетитель заполняет форму. Никому не нужно выбирать светофоры или вводить искажённые буквы. Для одного сообщения затраты ничтожны; тот, кто рассылает тысячи сообщений, платит их тысячи раз. Проверка решения почти не нагружает сервер.

Наш сервис ALTCHA

На основе открытого формата ALTCHA мы создали собственный сервис и опубликовали его с открытым исходным кодом. Он защищает любое количество сайтов одновременно и управляется через небольшой веб-интерфейс:

  • Подписанные задачи: каждая задача подписана (HMAC), привязана к сайту, для которого выдана, и действует ровно один раз — в том числе после перезапусков.
  • Формы без бэкенда: сервис отправляет проверенную заявку по почте получателю сайта, поэтому статическому сайту не нужен собственный серверный код.
  • Подписки на рассылку: проверенные подписки попадают в список рассылки в Notifuse, который отправляет письмо для подтверждения (double opt-in).
  • Собственный бэкенд: приложения со своим бэкендом проверяют решение через интерфейс сервиса.
  • Многоуровневая защита: ограничение частоты запросов для каждого клиента и сайта, поле-ловушка (honeypot) и строгая проверка того, откуда пришёл запрос.
  • Конфиденциальность: без cookies, без состояния в браузере, без загрузки файлов.
  • Эксплуатация: статистика в веб-интерфейсе, метрики Prometheus, проверка работоспособности и все данные в одном файле SQLite.

Виджет тоже поставляет сам сервис — на английском или со всеми его 68 языками.

Две строки на странице

<script type="module" src="https://altcha.example.com/widget.js"></script>
<form action="https://altcha.example.com/submit" method="post">
  <input name="email" type="email" required>
  <textarea name="message" required></textarea>
  <altcha-widget challenge="https://altcha.example.com/challenge"></altcha-widget>
  <button type="submit">Send</button>
</form>

Никакой сборки и никаких пакетов: те же строки работают в написанном вручную HTML, в Astro и в Angular.

В работе

Контактные формы и подписки на рассылку на esn.ge, epicsoft.one и на наших страницах продажи доменов работают через этот сервис.

Исходный код — на GitLab и GitHub, образ — на Docker Hub, по лицензии MIT. Проект не связан с проектом ALTCHA; он использует его виджет и библиотеку под лицензией MIT.

Будем рады настроить сервис и для вашего сайта.

Готовы к следующему шагу?

Лучшего момента, чтобы начать, ещё не было. Расскажите нам о своём проекте.

Связаться с нами