
Выпустил Commentail 1.3.0. Основные изменения касаются гостевых комментариев: появились готовые подключения внешних CAPTCHA, дополнительные проверки формы и текста, отдельные лимиты попыток отправки. Заодно исправлена работа формы в нескольких вкладках и при сбоях проверки.
Если с библиотекой ещё не знакомы, общий обзор есть на странице проекта. Здесь — изменения именно этого выпуска.
Google reCAPTCHA и Яндекс SmartCaptcha
Теперь в настройках Python можно выбрать готовый адаптер Google reCAPTCHA v2 с флажком или стандартный виджет Яндекс SmartCaptcha. Собственные CAPTCHA-backend сохраняют прежний интерфейс. Без дополнительных настроек остаётся локальная арифметическая задача: внешний сервис автоматически не включается.
Для Google настройка выглядит так. Если словарь COMMENTAIL в проекте уже есть, новые параметры нужно добавить в него.
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 и точные версии зависимостей. Сначала проверьте переход на восстановленной тестовой базе с локальной отправкой почты.
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 и очередь задач сохраняют прежние контракты; оставьте одно расписание фоновой обработки.
Эти проверки дают модератору дополнительные причины для решения и ограничивают частоту попыток. Насколько они сокращают реальный спам, пока не измерено. Полная инструкция перехода — в заметках к релизу, подробное поведение проверок — в руководстве по защите гостей.
Выберите способ входа или оставьте комментарий как гость ниже.