[SendIt 2.8.0 / 3.1.0] Proof of Work, шифрованная подпись поведения и контроль времени заполнения
Всем привет! В этом обновлении защита от спама была значительно усилена. Добавлены три новых уровня, которые делают автоматическую отправку форм экономически невыгодной и технически сложной. Аналогичный функционал доступен и в версии 3.1.0.
Проблема
Бот может загрузить страницу, получить CSRF-токен из куки и отправить форму напрямую, полностью обходя клиентские проверки. Параметр isBot передавался открыто в FormData, и его легко было подделать.
Что добавлено
Три механизма защиты, каждый из которых включается через параметры пресета:
При загрузке страницы генерируются уникальный challenge для PoW и ключ шифрования для подписи. Оба сохраняются в сессии и передаются клиенту через куки. После каждой успешной отправки challenge и ключ ротируются — повторно использовать старые нельзя.
Клиент знает, какие формы защищены, благодаря карте protectionMap, которая формируется на сервере из параметров пресетов и передаётся в window.siConfig. Формы поиска, пагинации или автосохранения, у которых эти параметры не указаны, работают без задержек.
Параметры пресета
Если параметры usePoW и useBehaviorSign не указаны в пресете — форма работает как раньше, с открытым параметром isBot и клиентской проверкой. Никаких изменений в вёрстке или вызовах сниппетов не требуется.
Спасибо за внимание!
Проблема
Бот может загрузить страницу, получить CSRF-токен из куки и отправить форму напрямую, полностью обходя клиентские проверки. Параметр isBot передавался открыто в FormData, и его легко было подделать.
Что добавлено
Три механизма защиты, каждый из которых включается через параметры пресета:
- Proof of Work — перед отправкой формы браузер решает криптографическую задачу: ищет такое число (nonce), при котором SHA-256 хеш начинается с заданного количества нулевых бит. При сложности 18 это занимает ~200-500мс. Сервер проверяет решение мгновенно. Для бота, отправляющего тысячи запросов, это создаёт ощутимую нагрузку.
- Шифрованная подпись поведения — результат анализа UserBehaviorTracker больше не передаётся открытым параметром isBot=0/1. Вместо этого весь результат requestAnalysis() шифруется на клиенте алгоритмом AES-128-GCM ключом из сессии. Сервер расшифровывает конверт и проверяет isBot, score и привязку к текущей сессии. Без ключа бот не может создать валидный конверт с isBot: false.
- Контроль времени заполнения — отслеживается момент первого фокуса на поле формы. Если с этого момента до отправки прошло меньше заданного порога (по умолчанию 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 и клиентской проверкой. Никаких изменений в вёрстке или вызовах сниппетов не требуется.
Спасибо за внимание!
Поблагодарить автора
Отправить деньги
0