[SendIt 2.8.0 / 3.1.0] Proof of Work, шифрованная подпись поведения и контроль времени заполнения

Всем привет! В этом обновлении защита от спама была значительно усилена. Добавлены три новых уровня, которые делают автоматическую отправку форм экономически невыгодной и технически сложной. Аналогичный функционал доступен и в версии 3.1.0.

Проблема

Бот может загрузить страницу, получить CSRF-токен из куки и отправить форму напрямую, полностью обходя клиентские проверки. Параметр isBot передавался открыто в FormData, и его легко было подделать.

Что добавлено

Три механизма защиты, каждый из которых включается через параметры пресета:

  1. Proof of Work — перед отправкой формы браузер решает криптографическую задачу: ищет такое число (nonce), при котором SHA-256 хеш начинается с заданного количества нулевых бит. При сложности 18 это занимает ~200-500мс. Сервер проверяет решение мгновенно. Для бота, отправляющего тысячи запросов, это создаёт ощутимую нагрузку.
  2. Шифрованная подпись поведения — результат анализа UserBehaviorTracker больше не передаётся открытым параметром isBot=0/1. Вместо этого весь результат requestAnalysis() шифруется на клиенте алгоритмом AES-128-GCM ключом из сессии. Сервер расшифровывает конверт и проверяет isBot, score и привязку к текущей сессии. Без ключа бот не может создать валидный конверт с isBot: false.
  3. Контроль времени заполнения — отслеживается момент первого фокуса на поле формы. Если с этого момента до отправки прошло меньше заданного порога (по умолчанию 3 секунды) — запрос отклоняется. Бот, заполняющий форму мгновенно, не пройдёт эту проверку.
Как это работает

При загрузке страницы генерируются уникальный challenge для PoW и ключ шифрования для подписи. Оба сохраняются в сессии и передаются клиенту через куки. После каждой успешной отправки challenge и ключ ротируются — повторно использовать старые нельзя.

Клиент знает, какие формы защищены, благодаря карте protectionMap, которая формируется на сервере из параметров пресетов и передаётся в window.siConfig. Формы поиска, пагинации или автосохранения, у которых эти параметры не указаны, работают без задержек.

Параметры пресета

'default' => [
    'usePoW' => 1,              // Включить Proof of Work
    'powDifficulty' => 18,      // Сложность (кол-во нулевых бит). 18 ~ 200-500мс
    'useBehaviorSign' => 1,     // Включить шифрованную подпись поведения
    'minFillTime' => 3,         // Минимальное время заполнения формы в секундах
    'maxBotScore' => 50,        // Порог score для отклонения (опционально)
],
Для форм, не нуждающихся в защите, параметры просто не указываются:

'search_something' => [
    'hooks' => '',
    'snippet' => '@FILE snippets/snippet.search.php'
],
Обратная совместимость

Если параметры usePoW и useBehaviorSign не указаны в пресете — форма работает как раньше, с открытым параметром isBot и клиентской проверкой. Никаких изменений в вёрстке или вызовах сниппетов не требуется.

Спасибо за внимание!
Артур Шевченко
6 часов назад
modx.pro
53
+3
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0