| Resumen | Proporciona dos formularios de publicación independientes y anónimos | |
| Enlace al repositorio | GitHub - elRicharde/discourse-anonymous-feedback: Anonymous Feedback Formular in Discourse · GitHub | |
| Guía de instalación | Cómo instalar plugins en Discourse |
Este plugin de Discourse proporciona dos formularios de publicación independientes y anónimos: «Feedback anónimo» y «Pizarra». Ambos formularios están protegidos por un «código de puerta» (una contraseña sencilla) y permiten a usuarios sin cuenta enviar un mensaje privado a un grupo de usuarios preconfigurado, incluso si tu foro requiere normalmente inicio de sesión; estos dos formularios no lo hacen.
Técnicamente, las publicaciones se envían a través de una página web sin necesidad de iniciar sesión y pueden incluso utilizarse en una pestaña de navegación privada. No existe posibilidad de rastrear al remitente, ya que las direcciones IP no se registran. Este plugin está diseñado para ofrecer un canal seguro y confidencial para la comunicación.
Por qué usar este plugin
En muchas comunidades, los temas delicados o las ideas requieren un canal de retroalimentación que garantice el anonimato y reduzca la presión social. Este plugin aborda varios desafíos clave:
-
Fomentar una retroalimentación sin inhibiciones: Proporciona un espacio seguro para que los usuarios (e incluso los no usuarios, si el código de puerta se comparte externamente) compartan opiniones honestas y sin filtros, preocupaciones o ideas innovadoras sin temor a juicios o represalias. Esto puede generar una aportación más sincera y valiosa que, de otro modo, podría omitirse.
-
Confidencialidad y confianza: Al garantizar el anonimato mediante medidas técnicas (como la limitación de velocidad basada en HMAC sin registro de direcciones IP), el plugin genera confianza y fomenta una participación más amplia, especialmente en temas delicados.
-
Cerrar brechas de comunicación: Crea un puente de comunicación accesible para personas que dudan en publicar públicamente o que no tienen una cuenta en Discourse, ampliando así el alcance de la participación comunitaria.
-
Entrada estructurada: Al dirigir la retroalimentación a un grupo privado específico, asegura que la información sensible sea revisada por los miembros del equipo adecuados, permitiendo una discusión y acción enfocadas lejos de la vista pública.
-
Sencillez para no usuarios: El mecanismo del código de puerta permite a partes externas o visitantes temporales aportar información sin la sobrecarga del registro completo de una cuenta.
En última instancia, este plugin mejora la interacción comunitaria al permitir un entorno más inclusivo y seguro para discusiones y sugerencias críticas.
Cómo funciona (visión técnica general)
El plugin se desarrolló con un enfoque en el anonimato y la seguridad.
-
Acceso: Un usuario navega a
/anonymous-feedbacko/white-board. -
Desbloqueo: El usuario debe ingresar el código de puerta correcto. El servidor valida este código.
-
Para evitar ataques de fuerza bruta, el servidor utiliza un sistema de limitación de velocidad basado en un hash HMAC de la dirección IP del usuario y un secreto rotativo. La dirección IP en sí nunca se almacena.
-
Si el código es correcto, el servidor establece una marca temporal de uso único en la sesión del usuario.
-
-
Envío: El usuario escribe y envía su mensaje.
-
Crear MP: El servidor verifica la marca de sesión. Si es válida, crea un nuevo mensaje privado dirigido al grupo objetivo configurado y lo publica como el usuario bot configurado (o usuario del sistema). Inmediatamente después, se elimina la marca de sesión, por lo que el usuario debe volver a ingresar el código de puerta para cualquier mensaje adicional.
Casos de uso / flujos de trabajo de ejemplo
Este plugin fue diseñado para ser flexible. Aquí tienes dos flujos de trabajo comunes que puedes implementar:
Caso de uso 1: La «Pizarra» - Un tablero de anuncios público moderado
Este caso de uso sirve para visibilizar temas delicados o comportamientos inapropiados observados en la comunidad (por ejemplo, en eventos o en interacciones generales). Por ejemplo, hacer visibles problemas como el sexismo.
El objetivo: Hacer visibles problemas importantes para la comunidad sin exponer la identidad de la persona que los reporta. El foco está en el mensaje, no en el remitente, y potencialmente ni siquiera en las personas involucradas. Una representación simple de situaciones con comportamientos inapropiados, sin mencionar nombres, sigue generando visibilidad y concienciación.
El flujo de trabajo:
-
Envío: Un usuario envía una publicación a través del formulario
/white-board. Esto puede ser accesible para miembros (MG), aprendices (ANW) y facilitadores (FM). Solo el USUARIO «Anonymous» puede crear publicaciones. -
Revisión privada: La publicación llega como un Mensaje Privado al
target_groupconfigurado (por ejemplo, un equipo de moderación o un comité de «Confianza y Seguridad»). Será identificable como una entrada de «Pizarra». -
Verificación: El equipo revisa la presentación según criterios predefinidos (por ejemplo, sin ataques personales, sin insultos, adherencia a las directrices de la comunidad).
-
Publicación (si se aprueba): Se invita a un administrador al mensaje, quien lo convierte en un tema público en una categoría pública dedicada llamada «Pizarra». Este tema se publica utilizando una cuenta genérica específica (por ejemplo, un usuario «WhiteBoardBot» o «Anonymous», configurado mediante el ajuste
bot_username). Las credenciales de inicio de sesión de este usuario pueden compartirse con el grupo de revisión. La publicación la realiza el USUARIO «Anonymous». -
Control de la discusión: Los permisos de la categoría «Pizarra» se configuran para que sea visible para miembros/aprendices/facilitadores, pero no para comentar. Se espera que los moderadores normales del foro no moderen esta área específica; esto es responsabilidad exclusiva del
target_groupdesignado. Todavía queda la cuestión de si la Pizarra debe contener subcategorías (por ejemplo, «anónimo cerrado» o categorías específicas para publicaciones detarget_group). -
Manejo de rechazos: Dado que no hay forma de contactar al remitente anónimo, es una buena práctica tener un tema fijado en la categoría «Pizarra» que explique los criterios de publicación y las razones por las que una presentación podría ser rechazada. Las reglas que justifican la no publicación deben hacerse públicas siempre en un solo lugar del foro.
Caso de uso 2: Feedback anónimo - Un canal directo y privado
Este caso de uso sirve para proporcionar una línea de comunicación directa y confidencial a un equipo específico para cualquier tipo de retroalimentación (por ejemplo, retroalimentación sobre votaciones u otras sugerencias anónimas).
El objetivo: Ofrecer a miembros y no miembros una forma segura de proporcionar retroalimentación sobre asuntos de la comunidad, votaciones u otros temas directamente a la dirección o a un comité relevante.
El flujo de trabajo:
-
Envío: Un usuario envía retroalimentación a través del formulario
/anonymous-feedback. La línea de asunto puede ayudar a categorizar el mensaje. Esta publicación llega con el prefijo de asunto «Mensaje anónimo - dd.mm.aaaa, hh:mm:ss» a la bandeja de entrada colectiva deltarget_group. -
Entrega privada: El mensaje llega como un Mensaje Privado al
target_group. Es identificable como «Feedback anónimo» por su prefijo de asunto. Eltarget_groupdecide luego qué hacer con el mensaje. -
Gestión interna: El equipo puede discutir la retroalimentación en privado, involucrar a otras partes relevantes si es necesario o decidir un curso de acción. Esta retroalimentación podría utilizarse para votos o sugerencias anónimas.
-
Mejor práctica para retroalimentación inapropiada: Si una presentación es inapropiada, el equipo puede simplemente eliminarla. Podrías considerar publicar un aviso genérico y público (por ejemplo, en una categoría «Noticias») indicando que «La retroalimentación recibida el [Fecha] no fue procesada porque violó nuestros estándares comunitarios para una comunicación respetuosa». Esto informa al remitente sin revelar detalles y le anima a volver a enviar de una manera más constructiva. Si se trata de una publicación para la Pizarra (identificable por no tener ninguna marca especial, o posiblemente un sufijo si es útil): los moderadores son invitados al mensaje, pero nadie responde al mensaje. Los moderadores convierten el mensaje en un tema en la categoría «Pizarra» → visible para miembros/aprendices/facilitadores y no comentable.
Características
-
Dos puntos finales independientes: Proporciona
/anonymous-feedbacky/white-board, cada uno con su propia configuración separada. -
Protección mediante código de puerta: Cada formulario está protegido por su propio código de puerta secreto para evitar el spam. El código de puerta es el mismo para todos, y la página también puede usarse en modo privado o en el ordenador de los padres.
-
Grupo objetivo configurable: Los mensajes de cada formulario se envían como un mensaje privado a un grupo de usuarios específico y configurable.
-
Sesión de un solo uso: Después de enviar un mensaje correctamente, el usuario es redirigido de nuevo a la pantalla del código de puerta. Debe ingresar el código nuevamente para enviar otro mensaje, lo que evita el spam simple de múltiples publicaciones. Después de enviar, vuelves al código de puerta; no es posible fácilmente hacer múltiples publicaciones.
-
Limitación de velocidad que preserva el anonimato: Protege contra ataques de fuerza bruta y spam sin registrar direcciones IP.
-
Protección contra bots: Contiene un campo honeypot oculto para atrapar bots simples.
-
Usuario remitente personalizado: Puedes definir un usuario bot para cada formulario para que los mensajes privados parezcan enviados por este usuario (por ejemplo, «FeedbackBot»). El usuario debe existir. Si está vacío, se usa por defecto el usuario del sistema.
-
Interfaz de usuario limpia y moderna: Los formularios se basan en un componente reutilizable de Ember.js para una experiencia de usuario consistente y limpia.
Instalación
Sigue la guía estándar para instalar plugins de Discourse: Instalar un plugin.
-
Agrega la URL del repositorio del plugin a tu archivo
app.yml:hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/elRicharde/discourse-anonymous-feedback -
Reconstruye tu contenedor:
cd /var/discourse && ./launcher rebuild app
Configuración
Después de la instalación, puedes configurar el plugin en la configuración de administración de Discourse. Busca «anonymous feedback». Todos los ajustes son independientes para los formularios «Anonymous Feedback» y «White Board».
| Ajuste | Descripción |
|---|---|
anonymous_feedback_enabled |
Activa o desactiva la página /anonymous-feedback. |
white_board_enabled |
Activa o desactiva la página /white-board. |
... door_code |
La contraseña secreta que los usuarios deben ingresar para acceder al formulario de mensajes. |
... target_group |
El nombre del grupo de usuarios que recibe los mensajes privados. Este grupo debe existir. |
... rate_limit_per_hour |
Un límite global sobre cuántos mensajes se pueden enviar por hora para evitar abusos. Establecer en 0 para desactivar. |
... max_message_length |
El número máximo de caracteres permitidos en el texto del mensaje. |
... hmac_rotation_hours |
Con qué frecuencia rota la clave secreta para la limitación de velocidad. Una duración más corta restablece los bloqueos por fuerza bruta más rápido, pero es ligeramente menos segura. |
... bot_username |
Opcional. El nombre de usuario del usuario que enviará el MP. El usuario debe existir. Si está vacío, se usa el usuario del sistema. |
Desarrollo / Arquitectura
-
Backend: Un único controlador de Ruby on Rails,
AnonymousFeedbackController, procesa todas las solicitudes para ambos puntos finales. Utiliza un métodokindque verifica la ruta de la solicitud (/anonymous-feedbackvs./white-board) para determinar qué configuraciones utilizar. Esto evita la duplicación de código. Un helper dinámicosettingsimplifica aún más la lectura de la configuración. -
Frontend: La interfaz de usuario se basa en un único componente reutilizable de Ember.js,
<AnonymousFeedbackForm />.-
Este componente contiene todo el HTML, CSS y la lógica de Javascript para el estado del formulario (desbloqueo, envío, manejo de errores).
-
Las plantillas de ruta (
anonymous-feedback.hbsywhite-board.hbs) son ahora extremadamente simples. Solo instan este componente y pasan los parámetros correctos (por ejemplo, título, URLs de API). Este enfoque DRY (Don’t Repeat Yourself) hace que el código del frontend sea limpio y fácil de mantener.
-
Análisis profundo: Anonimato y limitación de velocidad (HMAC)
Una característica central de este plugin es el equilibrio entre el anonimato absoluto y la protección contra abusos (spam).
El problema: Direcciones IP finitas
Las direcciones IPv4 consisten en un conjunto finito de combinaciones (aproximadamente 4.3 mil millones).
- El riesgo: Las funciones de hash (como SHA256) son funciones unidireccionales irreversibles. Sin embargo, si simplemente almacenáramos
SHA256(Dirección_IP), un atacante (o administrador) podría precalcular los hashes para todas las direcciones IP existentes (una «Tabla Arcoíris») en segundos. Al comparar el hash almacenado con su lista, podrían revelar inmediatamente la IP original.
La solución: HMAC con un secreto rotativo
Utilizamos HMAC (Código de Autenticación de Mensaje Basado en Hash). Esto combina el mensaje (IP) con una Clave Secreta criptográfica antes de realizar el hash.
-
El mecanismo:
Identificador = HMAC(Dirección_IP + Clave_Secreta) -
Por qué funciona: Aunque el atacante conoce todas las direcciones IP posibles, no conoce la
Clave_Secreta. Sin esta clave, no pueden precalcular los hashes. El ataque de «Tabla Arcoíris» se vuelve imposible porque falta la variable secreta.
Secreto hacia adelante (rotación de claves)
La Clave Secreta se rota automáticamente (por ejemplo, cada 4 horas).
-
Escenario: Imagina que el servidor es hackeado y el atacante roba la
Clave Secretaactual y la base de datos. -
Protección: Dado que la clave cambia regularmente y las claves antiguas se descartan permanentemente, el atacante solo puede calcular hashes de IP para la ventana de tiempo actual (por ejemplo, las últimas 4 horas). Todas las actividades de ayer o la semana pasada fueron hash con claves que ya no existen. Esto garantiza el Secreto hacia adelante: el anonimato pasado no puede ser roto, incluso si el sistema actual se ve comprometido.
Rotación rápida vs. lenta
Puedes configurar el intervalo de rotación (hmac_rotation_hours).
-
Rotación rápida (por ejemplo, 1 hora):
-
Ventajas: Máximo anonimato. La ventana de tiempo donde acciones distintas pueden vincularse al mismo actor (desconocido) es muy corta.
-
Desventajas: «Pérdida de memoria» para la limitación de velocidad. Cuando la clave rota, el servidor «olvida» quién ya ha enviado mensajes. Un spammer bloqueado en la Hora 1 queda efectivamente desbloqueado en la Hora 2.
-
-
Rotación lenta (por ejemplo, 24 horas):
-
Ventajas: Protección más fuerte contra el spam, ya que los bloqueos persisten por más tiempo.
-
Desventajas: Dentro de esta ventana de 24 horas, un administrador puede ver que el «Usuario X» envió 5 mensajes, incluso si no sabe quién es el «Usuario X» (Vinculabilidad).
-
Recomendación: Un valor entre 4 y 12 horas ofrece un equilibrio sólido.