| Краткое описание | Предоставляет две независимые формы анонимной публикации | |
| Ссылка на репозиторий | GitHub - elRicharde/discourse-anonymous-feedback: Anonymous Feedback Formular in Discourse · GitHub | |
| Руководство по установке | Как установить плагины в Discourse |
Этот плагин для Discourse предоставляет две независимые формы анонимной публикации: «Анонимный отзыв» и «Доска объявлений». Обе формы защищены «паролем входа» (простым паролем) и позволяют пользователям без аккаунта отправлять личные сообщения предварительно настроенной группе пользователей, даже если ваш форум обычно требует входа в систему. Эти две формы такого требования не предъявляют.
Технически сообщения отправляются через веб-страницу без необходимости входа в систему и могут использоваться даже в режиме инкогнито. Отследить отправителя невозможно, так как IP-адреса не регистрируются. Этот плагин разработан для обеспечения безопасного и конфиденциального канала связи.
Зачем использовать этот плагин?
Во многих сообществах чувствительные темы или идеи требуют канала обратной связи, гарантирующего анонимность и снижающего социальное давление. Этот плагин решает несколько ключевых задач:
-
Поощрение открытой обратной связи: Предоставляет безопасное пространство для пользователей (и даже для тех, кто не является пользователями, если пароль входа передан вовне), чтобы делиться честными, нефильтрованными мнениями, опасениями или инновационными идеями без страха осуждения или последствий. Это может привести к более откровенным и ценным отзывам, которые в противном случае могли бы остаться невысказанными.
-
Конфиденциальность и доверие: Обеспечивая анонимность с помощью технических мер (например, ограничение частоты запросов на основе HMAC без регистрации IP-адресов), плагин укрепляет доверие и поощряет более широкое участие, особенно в деликатных вопросах.
-
Преодоление разрывов в коммуникации: Создает доступный канал связи для людей, которые колеблются публиковать сообщения открыто или не имеют учетной записи Discourse, тем самым расширяя охват вовлеченности сообщества.
-
Структурированный ввод: Направляя отзывы в конкретную приватную группу, плагин гарантирует, что конфиденциальная информация будет рассмотрена соответствующими членами команды, что позволяет вести целенаправленное обсуждение и принимать меры вдали от посторонних глаз.
-
Простота для не-пользователей: Механизм пароля входа позволяет внешним сторонам или временным посетителям предоставлять отзывы без необходимости полной регистрации учетной записи.
В конечном итоге этот плагин улучшает взаимодействие в сообществе, создавая более инклюзивную и безопасную среду для критических обсуждений и предложений.
Как это работает (технический обзор)
Плагин разработан с акцентом на анонимность и безопасность.
-
Доступ: Пользователь переходит по адресу
/anonymous-feedbackили/white-board. -
Разблокировка: Пользователь должен ввести правильный пароль входа. Сервер проверяет этот код.
-
Для предотвращения атак методом грубой силы сервер использует систему ограничения частоты запросов на основе HMAC-хэша IP-адреса пользователя и вращающегося секрета. Сам IP-адрес никогда не сохраняется.
-
Если код верный, сервер устанавливает временный флаг, одноразовый для использования, в сессии пользователя.
-
-
Отправка: Пользователь пишет и отправляет свое сообщение.
-
Создание ЛС: Сервер проверяет флаг сессии. Если он действителен, создается новое личное сообщение для настроенной целевой группы, и оно публикуется от имени настроенного пользователя-бота (или системного пользователя). Флаг сессии затем немедленно удаляется, поэтому пользователю придется снова ввести пароль входа для любого следующего сообщения.
Примеры использования / рабочие процессы
Этот плагин разработан с учетом гибкости. Вот два распространенных рабочих процесса, которые вы можете реализовать:
Случай использования 1: «Доска объявлений» — модерируемая публичная доска объявлений
Этот сценарий предназначен для повышения видимости чувствительных тем или неуместного поведения, замеченного в сообществе (например, на мероприятиях или в общих взаимодействиях). Например, для освещения таких проблем, как сексизм.
Цель: Сделать важные проблемы видимыми для сообщества, не раскрывая личность сообщившего. Акцент делается на сообщении, а не на отправителе, и потенциально даже не на вовлеченных лицах. Простое описание ситуаций с неуместным поведением без указания имен все же создает видимость и повышает осведомленность.
Рабочий процесс:
-
Отправка: Пользователь отправляет пост через форму
/white-board. Доступ к ней имеют члены сообщества (MG), стажеры (ANW) и фасилитаторы (FM). Создавать посты может только пользователь «Anonymous». -
Приватная проверка: Пост приходит как личное сообщение в настроенную
target_group(например, в команду модерации или комитет «Trust & Safety»). Он будет идентифицироваться как запись «Доска объявлений». -
Проверка: Команда проверяет отправку по заранее определенным критериям (например, отсутствие личных нападок, оскорблений, соблюдение правил сообщества).
-
Публикация (если одобрено): К сообщению приглашается администратор, который преобразует его в публичную тему в выделенной публичной категории «Доска объявлений». Эта тема публикуется от имени специального, общего аккаунта (например, «WhiteBoardBot» или пользователя «Anonymous», настроенного через параметр
bot_username). Данные для входа этого пользователя могут быть переданы группе проверки. Публикация осуществляется пользователем «Anonymous». -
Контроль обсуждений: Права доступа к категории «Доска объявлений» настроены так, чтобы она была видна членам/стажерам/фасилитаторам, но недоступна для комментариев. Обычные модераторы форума не должны модерировать эту конкретную область; это исключительно ответственность назначенной
target_group. Все еще остается вопрос, должны ли в Доске объявлений быть подкатегории (например, «анонимно закрыто» или категории специально для постовtarget_group). -
Обработка отказов: Поскольку нет способа связаться с анонимным отправителем, хорошей практикой является закрепление темы в категории «Доска объявлений», объясняющей критерии публикации и причины, по которым отправка могла быть отклонена. Правила, оправдывающие непубликацию, всегда должны быть изложены в одном месте форума.
Случай использования 2: Анонимный отзыв — прямой, приватный канал
Этот сценарий предназначен для предоставления прямого, конфиденциального канала связи конкретной команде для любого вида обратной связи (например, для отзывов о голосовании или других анонимных предложений).
Цель: Дать членам и не-членам безопасный способ предоставить отзывы о вопросах сообщества, голосованиях или других темах напрямую руководству или соответствующему комитету.
Рабочий процесс:
-
Отправка: Пользователь отправляет отзыв через форму
/anonymous-feedback. Тема сообщения может помочь в его категоризации. Этот пост приходит с префиксом темы «Анонимное сообщение - дд.мм.гггг, чч:мм:сс» в общий почтовый ящикtarget_group. -
Приватная доставка: Сообщение приходит как личное сообщение в
target_group. Оно идентифицируется как «Анонимный отзыв» по префиксу темы. Затемtarget_groupрешает, что делать с сообщением. -
Внутренняя обработка: Команда может обсудить отзыв приватно, при необходимости привлечь другие соответствующие стороны или принять решение о дальнейших действиях. Этот отзыв может использоваться для отзывов о голосовании или других анонимных предложений.
-
Лучшая практика для неуместных отзывов: Если отправка неуместна, команда может просто удалить ее. Можно рассмотреть возможность публикации общего публичного уведомления (например, в категории «Новости»), в котором говорится: «Отзыв, полученный [Дата], не был обработан, так как он нарушил наши стандарты сообщества в отношении уважительного общения». Это информирует отправителя, не раскрывая никаких деталей, и побуждает его отправить сообщение повторно в более конструктивной форме. Если это пост для Доски объявлений (идентифицируется отсутствием специальной пометки или, возможно, суффиксом, если это полезно): модераторов приглашают к сообщению, но никто не отвечает на него. Модераторы преобразуют сообщение в тему в категории «Доска объявлений» → видимую для членов/стажеров/фасилитаторов и недоступную для комментариев.
Функции
-
Два независимых конечных узла: Предоставляет
/anonymous-feedbackи/white-board, каждый со своей отдельной конфигурацией. -
Защита паролем входа: Каждая форма защищена своим собственным секретным паролем входа для предотвращения спама. Пароль входа одинаков для всех, и страницу можно использовать также в приватном режиме или на компьютере родителей.
-
Настраиваемая целевая группа: Сообщения от каждой формы отправляются как личное сообщение в конкретную, настраиваемую группу пользователей.
-
Одноразовая сессия: После успешной отправки сообщения пользователь перенаправляется обратно на экран ввода пароля входа. Чтобы отправить еще одно сообщение, необходимо снова ввести код, что предотвращает простой спам с множественными постами. После отправки вы возвращаетесь к экрану ввода пароля, возможность многократной отправки исключена.
-
Сохраняющая анонимность система ограничения частоты запросов: Защищает от атак методом грубой силы и спама без регистрации IP-адресов.
-
Защита от ботов: Содержит скрытое поле-ловушку (honeypot) для обнаружения простых ботов.
-
Пользователь-отправитель: Вы можете определить пользователя-бота для каждой формы, чтобы личные сообщения выглядели так, будто они отправлены этим пользователем (например, «FeedbackBot»). Пользователь должен существовать. Если поле пустое, по умолчанию используется системный пользователь.
-
Чистый, современный пользовательский интерфейс: Формы основаны на повторно используемом компоненте Ember.js для обеспечения последовательного и чистого пользовательского опыта.
Установка
Следуйте стандартному руководству по установке плагинов Discourse: Установка плагина.
-
Добавьте URL репозитория плагина в ваш файл
app.yml:hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/elRicharde/discourse-anonymous-feedback -
Пересоберите контейнер:
cd /var/discourse && ./launcher rebuild app
Конфигурация
После установки вы можете настроить плагин в настройках администратора Discourse. Найдите «anonymous feedback». Все настройки независимы для форм «Анонимный отзыв» и «Доска объявлений».
| Параметр | Описание |
|---|---|
anonymous_feedback_enabled |
Включает или отключает страницу /anonymous-feedback. |
white_board_enabled |
Включает или отключает страницу /white-board. |
... door_code |
Секретный пароль, который пользователи должны ввести для доступа к форме сообщений. |
... target_group |
Имя группы пользователей, которая получает личные сообщения. Эта группа должна существовать. |
... rate_limit_per_hour |
Глобальный лимит количества сообщений, которые можно отправить за час, для предотвращения злоупотреблений. Установите 0, чтобы отключить. |
... max_message_length |
Максимальное количество символов, разрешенных в тексте сообщения. |
... hmac_rotation_hours |
Как часто вращается секретный ключ для ограничения частоты запросов. Более короткий срок быстрее сбрасывает блокировки методом грубой силы, но немного менее безопасен. |
... bot_username |
Опционально. Имя пользователя, от имени которого будет отправлено ЛС. Пользователь должен существовать. Если поле пустое, используется системный пользователь. |
Разработка / Архитектура
-
Бэкенд: Один контроллер Ruby on Rails,
AnonymousFeedbackController, обрабатывает все запросы для обоих конечных узлов. Он использует методkind, который проверяет путь запроса (/anonymous-feedbackпротив/white-board), чтобы определить, какие конфигурации использовать. Это исключает дублирование кода. Динамический помощникsettingдополнительно упрощает чтение конфигурации. -
Фронтенд: Пользовательский интерфейс основан на одном повторно используемом компоненте Ember.js,
<AnonymousFeedbackForm />.-
Этот компонент содержит весь HTML, CSS и логику Javascript для состояния формы (разблокировка, отправка, обработка ошибок).
-
Шаблоны маршрутов (
anonymous-feedback.hbsиwhite-board.hbs) теперь предельно просты. Они просто создают экземпляр этого компонента и передают правильные параметры (например, заголовок, URL API). Такой подход DRY (Don’t Repeat Yourself) делает код фронтенда чистым и легким в поддержке.
-
Глубокое погружение: Анонимность и ограничение частоты запросов (HMAC)
Ключевой функцией этого плагина является баланс между абсолютной анонимностью и защитой от злоупотреблений (спамом).
Проблема: Ограниченное количество IP-адресов
IPv4-адреса состоят из конечного набора комбинаций (около 4,3 миллиарда).
- Риск: Хэш-функции (например, SHA256) являются необратимыми односторонними функциями. Однако, если мы просто будем хранить
SHA256(IP_Address), злоумышленник (или администратор) может заранее рассчитать хэши для всех существующих IP-адресов (так называемая «радужная таблица») за секунды. Сравнивая сохраненный хэш со своим списком, он может немедленно раскрыть исходный IP.
Решение: HMAC с вращающимся секретом
Мы используем HMAC (код аутентификации сообщений на основе хэша). Это объединяет сообщение (IP) с криптографическим секретным ключом перед хэшированием.
-
Механизм:
Идентификатор = HMAC(IP_Address + Secret_Key) -
Почему это работает: Даже если злоумышленник знает все возможные IP-адреса, он не знает
Secret_Key. Без этого ключа он не может заранее рассчитать хэши. Атака «радужной таблицы» становится невозможной, так как отсутствует секретная переменная.
Прямая секретность (вращение ключей)
Secret Key вращается автоматически (например, каждые 4 часа).
-
Сценарий: Представьте, что сервер взломан, и злоумышленник похитил текущий секретный ключ и базу данных.
-
Защита: Поскольку ключ регулярно меняется, а старые ключи навсегда удаляются, злоумышленник может рассчитать хэши IP только для текущего временного окна (например, последних 4 часов). Вся активность за вчера или на прошлой неделе была хэширована с ключами, которые больше не существуют. Это обеспечивает прямую секретность: прошлая анонимность не может быть нарушена, даже если текущая система скомпрометирована.
Быстрое vs Медленное вращение
Вы можете настроить интервал вращения (hmac_rotation_hours).
-
Быстрое вращение (например, 1 час):
-
Плюсы: Максимальная анонимность. Временное окно, в течение которого различные действия могут быть связаны с одним и тем же (неизвестным) лицом, очень короткое.
-
Минусы: «Потеря памяти» для ограничения частоты запросов. При вращении ключа сервер «забывает», кто уже отправлял сообщения. Спаммер, заблокированный в 1-м часу, фактически разблокируется во 2-м часу.
-
-
Медленное вращение (например, 24 часа):
-
Плюсы: Более сильная защита от спама, так как блокировки сохраняются дольше.
-
Минусы: В течение этого 24-часового окна администратор может видеть, что «Пользователь X» отправил 5 сообщений, даже если он не знает, кто такой «Пользователь X» (возможность связывания).
-
Рекомендация: Значение между 4 и 12 часами обеспечивает надежный баланс.