Escudo de Enlace Externo – Confirmación de Salida y Control de Confianza

:information_source: Resumen Este componente de tema añade protección configurable para enlaces externos en publicaciones cocinadas. Aplica reglas basadas en el nivel de confianza, redirecciones opcionales de inicio de sesión e información, indicadores visuales para dominios de confianza y una ventana modal de confirmación de salida personalizable.
:eyeglasses: Vista Previa Theme Creator
:hammer_and_wrench: Repositorio https://github.com/VaperinaDEV/external-link-shield
:question: Guía de Instalación Cómo instalar un tema o componente de tema
:open_book: ¿Nuevo en Temas de Discourse? Guía para principiantes sobre el uso de temas de Discourse

Instalar este componente de tema

Hola :waving_hand:

Me gustaría compartir un Componente de Tema que añade control detallado sobre los enlaces externos en publicaciones cocinadas, combinando:

  • control de acceso basado en el nivel de confianza
  • protección de usuario anónimo
  • una ventana modal de confirmación de salida personalizada
  • e indicadores visuales para dominios confiables versus desconocidos

Este componente está diseñado para comunidades donde los enlaces externos pueden implicar implicaciones legales, de seguridad o de confianza.


:sparkles: Características

:gear: Reglas de nivel de confianza configurables

Todos los comportamientos basados en el nivel de confianza son totalmente configurables a través de la configuración del tema.

Puede habilitar o deshabilitar independientemente:

  • bloqueo de usuarios anónimos
  • reemplazo informativo para TL0
  • requisito de revelación manual para TL1
  • ventana modal de confirmación de salida para niveles de confianza más altos

Esto permite que el componente se adapte a políticas comunitarias muy diferentes, desde un blindaje estricto de enlaces hasta una mínima fricción para el usuario.

:locked_with_key: Enlaces externos conscientes del nivel de confianza

Los enlaces externos se comportan de manera diferente según el nivel de confianza del espectador:

  • Usuarios anónimos
    • Los enlaces externos se reemplazan con un enlace de inicio de sesión o una URL personalizada definida en la configuración.
  • TL0
    • Los enlaces se reemplazan con una redirección configurable, por ejemplo, un tema que explica los niveles de confianza o cualquier otra URL definida en la configuración.
  • TL1
    • Los enlaces requieren revelación manual (clic para ver), luego hacer clic en el enlace muestra la ventana modal de confirmación de salida.
  • TL2+
    • Los enlaces se comportan normalmente pero siempre muestran una ventana modal de confirmación de salida.

:door: Ventana modal de confirmación de salida

Antes de salir del foro, los usuarios ven una ventana modal que:

  • Indica claramente que están abandonando la comunidad
  • Muestra la URL de destino completa en etiquetas <code>
  • Respeta la preferencia del usuario external_links_in_new_tab

Esto es especialmente útil para:

  • comunidades con mucha carga de cumplimiento
  • mitigación de phishing
  • educar a usuarios con menos experiencia


:magnifying_glass_tilted_left: Comportamiento basado en el dominio a través de la configuración

El componente introduce dos configuraciones de tema:

internal_domains:
  type: list
  default: ""
  description: "Sus dominios de foro y CDN (ej. example.com|example-cdn.com). Estos NO tendrán icono NI modal."

excluded_domains:
  type: list
  default: ""
  description: "Dominios externos de confianza (ej. youtube.com|google.com). Estos mostrarán un icono de CANDADO pero omitirán el modal/blindaje."
  • Dominios internos
    • Tratados como internos → sin icono, sin modal
  • Dominios excluidos (de confianza)
    • Muestran un icono de candado :locked:
    • Omiten la verificación del nivel de confianza y el modal
  • Todos los demás enlaces externos
    • Muestran un icono de enlace externo
    • Están sujetos a verificación y/o confirmación según el nivel de confianza

:artist_palette: Indicadores visuales (SCSS)

Los iconos se añaden puramente a través de CSS:

  • Enlaces externos desconocidos → icono de enlace externo
  • Enlaces externos de confianza → icono de candado (color de éxito)

Esto mantiene el DOM limpio y evita la inyección de iconos basada en JS.

Esta captura de pantalla muestra cómo el componente distingue visualmente entre:

  • Dominios excluidos: enlaces externos de confianza (icono de candado, sin confirmación de salida),
  • Dominios internos: enlaces internos (sin icono, sin confirmación de salida),
  • enlaces externos desconocidos (icono de enlace externo con confirmación de salida).

:pushpin: Casos de uso

Este componente es útil si desea:

  • Proteger a los usuarios de enlaces externos inseguros o engañosos
  • Educar a los nuevos usuarios antes de permitirles abandonar el foro
  • Aplicar la progresión de confianza de la comunidad
  • Añadir exenciones legales/de cumplimiento sin romper la experiencia de usuario
12 Me gusta

¡Componente de Tema Fantástico!

De hecho, construimos algo similar donde también ocultamos las insignias de recuento de clics y las reemplazamos con insignias de verificado/peligro.

Lo usamos principalmente para nuestros proveedores y comerciantes verificados/de confianza con los que tenemos una asociación de afiliados.

Además, nuestra ventana emergente también muestra códigos de cupón que se gestionan a través del editor de configuración de Objetos del componente de tema.

3 Me gusta

¡Este es un componente temático genial! ¡Gracias por compartirlo!

1 me gusta

Pero los visitantes no registrados pueden abrir un enlace externo directamente (tienen permitido abrir enlaces). ¿Está planeado así y la información/advertencia solo se muestra a ciertos niveles de confianza (TL)?

1 me gusta

Haga clic derecho para abrir en una nueva pestaña y omitir la verificación de enlaces externos.

¿Se puede restringir esta parte?

Esto es genial, Don. ¡Gracias por crearlo y compartirlo!

Me pregunto por qué los enlaces externos de confianza usan un icono de candado. Quiero decir, se puede interpretar como “bloqueado” :sweat_smile: cuando en realidad están permitidos.

Voy a probar este componente; parece cubrir todos nuestros casos de uso para enlaces externos. También voy a intentar mover los iconos a la derecha, ya que entiendo que ese es el estándar común.

Como siempre, solo comparto mis ideas y me alegra si el TC puede mejorarse con ellas.

2 Me gusta

Hola :waving_hand:

He actualizado el componente de tema a la v2.0 :tada:: DEV: Replace CSS-drawn link icons with configurable d-icon rendering; fix anonymous blocking crashAdd files via upload - Pull Request #1 - VaperinaDEV/external-link-shield - GitHub

Esta actualización incluye:

  • Sustitución de los iconos mask-image de SVG mantenidos manualmente por elementos reales <svg class="d-icon"> renderizados mediante iconHTML(), insertados junto a los enlaces por secure-links.js

  • Añadido de ajustes:

    • exit_confirmation_continue_icon
    • external_link_icon,
    • trusted_link_icon,
    • external_link_icon_color,
    • trusted_link_icon_color,
    • link_icon_position (antes/después)
  • Corrección de un error que causaba el bloqueo cuando enable_anonymous_blocking está desactivado: currentUser.trust_level se leía para usuarios anónimos (null), lo que provocaba una excepción y dejaba silenciosamente el <a> original sin procesar ni proteger; ahora los visitantes anónimos obtienen un paso definido (icono + modal de confirmación opcional, sin control por nivel de confianza)


> ./support --coffee :heart:

2 Me gusta

Sugerencia para la v2.1: Usar el tipo de configuración de icono

4 Me gusta

Genial, gracias, lo cambié. :slightly_smiling_face:

3 Me gusta

¿Cómo no sabía de la existencia de este componente? Muchas gracias por mantenerlo, lo probaré :heart_eyes:

2 Me gusta

Con las últimas y rápidas mejoras, puedo confirmar que este componente de tema maneja todos los casos de uso que teníamos con enlaces externos.

¡Saludos al gran Don!

1 me gusta

Al previsualizar un tema en el modal de vista previa, hacer clic en una imagen para ampliarla (abrir el lightbox) también activa el modal de «confirmación de salida» del componente External Link Shield, aunque estos enlaces de imagen no son enlaces externos. Son imágenes subidas localmente y servidas desde nuestro propio dominio/CDN, no imágenes enlazadas externamente ni de fuentes externas.

¿El dominio del CDN es diferente al dominio de tu foro? Si es así, también debes añadir el dominio del CDN a la configuración internal_domains.

2 Me gusta

Añadí mi propio dominio a la configuración internal_domains y eso lo resolvió.

2 Me gusta

Me pregunto si esta fantástica función podría añadirse a los enlaces de la barra lateral.

Tenemos varios enlaces externos allí, y creo que sería una buena idea estilizarlos también. Quizás sin modal y/o restricciones, ya que la situación ideal es evitar fricciones innecesarias (son enlaces verificados).

Me intriga un poco, porque todavía no estoy del todo seguro de entender el caso de uso.

La barra lateral ya permite asignar un icono a cada enlace, y los enlaces añadidos por un administrador ya están verificados. Las secciones de la barra lateral creadas por el usuario son similares en el sentido de que el usuario está añadiendo explícitamente enlaces que ya conoce y en los que confía.

Así que sin duda puedo ver el valor de aplicar el estilo de enlace externo allí, pero no estoy seguro de qué valor adicional aportaría el componente más allá del soporte de iconos existente de la barra lateral, especialmente dado que mencionaste que no quieres el modal ni las restricciones.

¿Tu objetivo principal sería simplemente indicar visualmente que un enlace de la barra lateral apunta a un sitio externo, utilizando el mismo estilo/icono que el componente?

1 me gusta

Gracias por considerar esto. Exacto, el comportamiento deseado es informar a los usuarios que estarán en una nueva página.