Мои проекты

Commentail 1.3.0: защита гостей и внешние CAPTCHA

В Commentail 1.3.0 добавлены Google reCAPTCHA и Яндекс SmartCaptcha, лимиты гостевых попыток и проверки повторяющегося текста и ссылок. Разбираю, как они работают и что нужно учесть при обновлении.

Коротко

  • Google reCAPTCHA v2 и Яндекс SmartCaptcha подключаются по желанию; арифметическая CAPTCHA остаётся по умолчанию.
  • Подозрительные гостевые сообщения и правки направляются на модерацию с объяснением причины.
  • Формы в разных вкладках работают независимо, а ошибки CAPTCHA сохраняют редактируемый черновик.
Синяя птица Commentail на облачке комментария и номер версии 1.3.0.
Commentail 1.3.0 — комментарии для сайтов на Wagtail.

Выпустил Commentail 1.3.0. Основные изменения касаются гостевых комментариев: появились готовые подключения внешних CAPTCHA, дополнительные проверки формы и текста, отдельные лимиты попыток отправки. Заодно исправлена работа формы в нескольких вкладках и при сбоях проверки.

Если с библиотекой ещё не знакомы, общий обзор есть на странице проекта. Здесь — изменения именно этого выпуска.

Google reCAPTCHA и Яндекс SmartCaptcha

Теперь в настройках Python можно выбрать готовый адаптер Google reCAPTCHA v2 с флажком или стандартный виджет Яндекс SmartCaptcha. Собственные CAPTCHA-backend сохраняют прежний интерфейс. Без дополнительных настроек остаётся локальная арифметическая задача: внешний сервис автоматически не включается.

Для Google настройка выглядит так. Если словарь COMMENTAIL в проекте уже есть, новые параметры нужно добавить в него.

python
import os

COMMENTAIL = {
    "default": {
        "CAPTCHA_BACKEND": "commentail.captcha_providers.GoogleRecaptcha",
        "CAPTCHA_OPTIONS": {
            "site_key": os.environ["CAPTCHA_SITE_KEY"],
            "secret_key": os.environ["CAPTCHA_SECRET_KEY"],
            "timeout": 3,
        },
    },
}

Для Яндекса используется класс commentail.captcha_providers.YandexSmartCaptcha. Ключи нужно создать у выбранного провайдера и привязать к реальным доменам сайта; секретный ключ хранится на сервере. При переопределении CAPTCHA_OPTIONS для отдельного hostname словарь заменяется целиком, поэтому в нём нужны оба ключа.

Внешним виджетам нужен JavaScript, в том числе при обычной HTML-отправке формы. Если выбранный провайдер недоступен, проверка не переключается на арифметику и не пропускается. Текст остаётся доступным для редактирования, после ошибки можно повторить проверку. Перед подключением сервиса нужно также проверить политику конфиденциальности сайта и разрешённые источники CSP. Подробности — в руководстве по провайдерам.

Сервер проверяет ответ провайдера по фиксированному HTTPS-адресу, ограничивает размер токена и ответа и не следует перенаправлениям. Проверка имени хоста не позволяет принять ответ для другого сайта; таймаут настраивается от одной до десяти секунд, по умолчанию — три.

Проверки формы и лимиты попыток

В гостевой форме появилось скрытое поле-ловушка. Оно исключено из навигации клавиатурой и дерева доступности. Если поле заполнено, сообщение получает сигнал для модератора. Ещё один сигнал — отправка быстрее чем через две секунды после создания формы. Время задаётся сервером и сохраняется при восстановлении действующего черновика.

Быстрая отправка не заставляет читателя ждать таймер и сама по себе не отклоняет комментарий. Модератор увидит причину проверки в приватной карточке и сможет одобрить сообщение.

Попытки гостевой отправки теперь ограничены отдельно от успешно принятых комментариев: по умолчанию 10 попыток на сессию в минуту, 30 на IP в минуту и 300 на IP в час, в пределах сайта. Ошибочные проверки тоже расходуют этот бюджет. Лимит проверяется до обращения к внешней CAPTCHA и создания письма. Для сетей, где много людей используют один IP, пороги стоит настроить под реальный трафик.

В режиме adaptive гость с запомненным подтверждением почты обычно пропускает CAPTCHA; включённые сигналы заголовков запроса могут потребовать её снова. Режим GUEST_CAPTCHA_MODE со значением always проверяет каждую гостевую отправку. На зарегистрированных авторов эти гостевые проверки не распространяются.

Исправлена и очистка журнала лимитов: если для сайта задан интервал больше часа, фоновый проход сохраняет события на весь нужный срок, чтобы лимит не сбрасывался раньше времени.

Повторяющийся текст и множество ссылок

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

Вторая проверка срабатывает на три и более явные HTTP(S)- или www-ссылки. Повтор одной ссылки считается несколько раз, а обычные домены без такого префикса и адреса почты эта проверка не учитывает. Она работает и при выключенных кликабельных ссылках. Короткие одинаковые ответы и одна-две ссылки не достигают стандартных порогов.

Проверки действуют и для гостевых правок. Если правка получила сигнал, опубликованный текст остаётся прежним, пока модератор не примет решение. Причины видны в приватной карточке правки. Сигналы не удаляют текст автоматически; в режиме применения правил явные правила отклонения по-прежнему имеют приоритет.

Ссылки никуда не отправляются для проверки репутации и не открываются сервером. Для поиска повторов хранится отпечаток текста с секретным ключом, а не ещё одна копия комментария. История начинается с новых принятых гостевых отправок и предложенных правок: старые комментарии после обновления не сканируются.

Настройка новых проверок

Пороги задаются в COMMENTAIL и могут различаться для отдельных сайтов. Основные параметры:

Параметр По умолчанию Назначение
GUEST_CAPTCHA_MODE adaptive Когда требовать CAPTCHA у гостей
GUEST_FORM_MIN_SECONDS 2 Порог быстрой отправки, в секундах
GUEST_DUPLICATE_WINDOW_SECONDS 3600 Окно сравнения повторов, в секундах
GUEST_DUPLICATE_MIN_LENGTH 80 Минимальная длина нормализованного текста
GUEST_LINK_REVIEW_THRESHOLD 3 Число явных ссылок для модерации

Нулевой GUEST_FORM_MIN_SECONDS отключает проверку времени. Нулевые GUEST_DUPLICATE_WINDOW_SECONDS и GUEST_LINK_REVIEW_THRESHOLD отключают соответствующие проверки содержимого. Остальные квоты и подтверждение почты продолжают действовать. Полный список параметров и лимитов есть в Wiki.

Вкладки, длинные черновики и ошибки CAPTCHA

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

Для встроенных адаптеров Google и Яндекса локальная привязка проверки теперь живёт столько же, сколько форма: по умолчанию один час. Можно сначала написать длинный комментарий, а затем пройти свежую проверку. Это не продлевает токен самого провайдера: его срок и одноразовое использование проверяются отдельно. Фоновых запросов для продления нет.

У внешнего виджета убрана обычная кнопка обновления задачи; после ошибки появляется повтор проверки. У арифметической задачи обновление остаётся. При незавершённой внешней проверке улучшенная JavaScript-форма сохраняет черновик и не отправляет его преждевременно.

Как обновиться с 1.2.0

Перед обновлением сохраните базу, настройки, шаблоны, media, SECRET_KEY и точные версии зависимостей. Сначала проверьте переход на восстановленной тестовой базе с локальной отправкой почты.

bash
python -m pip install --upgrade commentail==1.3.0
python manage.py migrate
python manage.py check
python manage.py collectstatic --noinput

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

Если переопределяли шаблоны формы или CAPTCHA, сравните их с новой версией: важно сохранить CSRF, ключи отправки, поля проверки и новые привязки возраста черновика и провайдера. Старая форма без поля-ловушки продолжит работать, но не даст соответствующего сигнала.

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

Эти проверки дают модератору дополнительные причины для решения и ограничивают частоту попыток. Насколько они сокращают реальный спам, пока не измерено. Полная инструкция перехода — в заметках к релизу, подробное поведение проверок — в руководстве по защите гостей.

Была ли статья полезна?

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

Имя: до 40 символов.

После отправки мы пришлём письмо со ссылкой для подтверждения email.

Не более 5000 символов.

Опубликованных комментариев пока нет.