Bouclier de lien externe – Confirmation de sortie et vérification de confiance

:information_source: Résumé Ce composant de thème ajoute une protection configurable pour les liens externes dans les messages cuits. Il applique des règles basées sur le niveau de confiance, des redirections optionnelles de connexion et d’information, des indicateurs visuels pour les domaines de confiance et une modale de confirmation de sortie personnalisable.
:eyeglasses: Aperçu Theme Creator
:hammer_and_wrench: Dépôt \u003chttps://github.com/VaperinaDEV/external-link-shield\u003e
:question: Guide d’installation Comment installer un thème ou un composant de thème
:open_book: Nouveau sur les thèmes Discourse ? Guide du débutant pour utiliser les thèmes Discourse

Installer ce composant de thème

Bonjour :waving_hand:

J’aimerais partager un Composant de Thème qui ajoute un contrôle granulaire sur les liens externes dans les messages cuits, combinant :

  • un contrôle d’accès basé sur le niveau de confiance
  • une protection pour les utilisateurs anonymes
  • une modale de confirmation de sortie personnalisée
  • et des indicateurs visuels pour les domaines de confiance par rapport aux domaines inconnus

Ce composant est conçu pour les communautés où les liens externes peuvent avoir des implications légales, de sécurité ou de confiance.


:sparkles: Fonctionnalités

:gear: Règles de niveau de confiance configurables

Tous les comportements basés sur le niveau de confiance sont entièrement configurables via les paramètres du thème.

Vous pouvez activer ou désactiver indépendamment :

  • le blocage des utilisateurs anonymes
  • le remplacement d’information pour TL0
  • l’exigence de révélation manuelle pour TL1
  • la modale de confirmation de sortie pour les niveaux de confiance supérieurs

Cela permet au composant de s’adapter à des politiques communautaires très différentes, allant d’un blindage strict des liens à une friction minimale pour l’utilisateur.

:locked_with_key: Liens externes conscients du niveau de confiance

Les liens externes se comportent différemment en fonction du niveau de confiance de l’utilisateur :

  • Utilisateurs anonymes
    • Les liens externes sont remplacés par un lien de connexion ou une URL personnalisée définie dans les paramètres.
  • TL0
    • Les liens sont remplacés par une redirection configurable, par exemple un sujet expliquant les niveaux de confiance ou toute autre URL définie dans les paramètres.
  • TL1
    • Les liens nécessitent une révélation manuelle (cliquer pour voir), puis cliquer sur le lien affiche la modale de confirmation de sortie.
  • TL2+
    • Les liens se comportent normalement mais affichent toujours une modale de confirmation de sortie.

:door: Modale de confirmation de sortie

Avant de quitter le forum, les utilisateurs voient une modale qui :

  • Indique clairement qu’ils quittent la communauté
  • Affiche l’URL de destination complète dans des balises \u003ccode\u003e
  • Respecte la préférence de l’utilisateur external_links_in_new_tab

Ceci est particulièrement utile pour :

  • les communautés soumises à des contraintes de conformité
  • l’atténuation du phishing
  • l’éducation des utilisateurs moins expérimentés


:magnifying_glass_tilted_left: Comportement basé sur le domaine via les paramètres

Le composant introduit deux paramètres de thème :

internal_domains:
  type: list
  default: ""
  description: "Vos domaines de forum et CDN (ex: example.com|example-cdn.com). Ceux-ci n'auront AUCUNE icône et AUCUNE modale."

excluded_domains:
  type: list
  default: ""
  description: "Domaines externes de confiance (ex: youtube.com|google.com). Ceux-ci afficheront une icône de Cadenas mais ignoreront la modale/le blindage."
  • Domaines internes
    • Traités comme internes → pas d’icône, pas de modale
  • Domaines exclus (de confiance)
    • Affichent une icône de cadenas :locked:
    • Sautent le contrôle du niveau de confiance et la modale
  • Tous les autres liens externes
    • Affichent une icône de lien externe
    • Sont contrôlés et/ou confirmés en fonction du niveau de confiance

:artist_palette: Indicateurs visuels (SCSS)

Les icônes sont ajoutées purement via CSS :

  • Liens externes inconnus → icône external-link
  • Liens externes de confiance → icône de cadenas (couleur succès)

Ceci maintient le DOM propre et évite l’injection d’icônes basée sur JS.

Cette capture d’écran montre comment le composant distingue visuellement :

  • Domaines exclus : liens externes de confiance (icône de cadenas, pas de confirmation de sortie),
  • Domaines internes : liens internes (pas d’icône, pas de confirmation de sortie),
  • liens externes inconnus (icône external-link avec confirmation de sortie).

:pushpin: Cas d’utilisation

Ce composant est utile si vous souhaitez :

  • Protéger les utilisateurs contre les liens externes dangereux ou trompeurs
  • Éduquer les nouveaux utilisateurs avant de les laisser quitter le forum
  • Appliquer la progression de la confiance de la communauté
  • Ajouter des mentions légales/de conformité sans nuire à l’expérience utilisateur
12 « J'aime »

Composant de thème fantastique !!!

Nous avons en fait construit quelque chose de similaire où nous masquons également les badges de nombre de clics et les remplaçons par des badges vérifiés/danger.

Nous l’avons principalement utilisé pour nos vendeurs et commerçants vérifiés/de confiance avec lesquels nous avons un partenariat d’affiliation.

De plus, notre fenêtre contextuelle affiche également des codes de réduction gérés via l’éditeur de paramètres d’objet du composant de thème.

3 « J'aime »

C’est un excellent composant de thème ! Merci de le partager !!!

1 « J'aime »

Mais les visiteurs non connectés peuvent ouvrir un lien externe directement (ils sont autorisés à ouvrir des liens). C’est prévu ainsi et l’information/l’avertissement n’est montré qu’à certains niveaux de confiance ?

1 « J'aime »

Faites un clic droit pour ouvrir dans un nouvel onglet afin de contourner la vérification des liens externes.

Est-il possible de limiter cette partie ?

C’est super Don, merci de l’avoir créé et partagé !

Je me demande pourquoi les liens externes de confiance utilisent une icône de cadenas ? Je veux dire, cela peut être interprété comme « verrouillé » :sweat_smile: alors qu’ils sont autorisés.

J’essaierai ce composant ; il semble couvrir tous nos cas d’utilisation pour les liens externes. J’essaierai aussi de déplacer les icônes à droite, car je comprends que c’est le standard courant.

Comme toujours, je partage simplement mes réflexions et je serai ravi que le TC puisse être amélioré grâce à elles.

2 « J'aime »

Bonjour :waving_hand:

J’ai mis à jour le composant de thème en 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

Cette mise à jour contient :

  • Remplacement des icônes mask-image SVG gérées manuellement par de vrais éléments <svg class="d-icon"> rendus via iconHTML(), insérés à côté des liens par secure-links.js

  • Ajout de paramètres :

    • exit_confirmation_continue_icon
    • external_link_icon,
    • trusted_link_icon,
    • external_link_icon_color,
    • trusted_link_icon_color,
    • link_icon_position (avant/après)
  • Correction d’un plantage lorsque enable_anonymous_blocking est désactivé : currentUser.trust_level était lu pour les utilisateurs anonymes (null), ce qui provoquait une erreur et laissait silencieusement le <a> d’origine non traité/non protégé ; les visiteurs anonymes obtiennent désormais un passage bien défini (icône + modale de confirmation optionnelle, sans filtrage par niveau de confiance)


> ./support --coffee :heart:

2 « J'aime »

Suggestion for v2.1: Using the icon setting type

4 « J'aime »

Cool, merci, j’ai fait la modification. :slightly_smiling_face:

3 « J'aime »

Comment n’avais-je pas connaissance de l’existence de ce composant ? Merci beaucoup pour la maintenance, je vais le tester :heart_eyes:

2 « J'aime »

Grâce aux dernières et rapides améliorations, je peux confirmer que ce composant Theme gère tous les cas d’usage que nous avions avec les liens externes.

Chapeau au grand Don !

1 « J'aime »

Lors de l’aperçu d’un sujet dans la fenêtre modale d’aperçu des sujets, le clic sur une image pour l’agrandir (ouverture de la lightbox) déclenche également la fenêtre modale de « confirmation de sortie » du composant External Link Shield — alors que ces liens d’image ne sont pas des liens externes. Il s’agit d’images téléversées localement, servies depuis notre propre domaine/CDN, et non d’images hébergées ailleurs ou externes.

Le domaine du CDN est-il différent de celui de votre forum ? Si c’est le cas, vous devez également ajouter le domaine du CDN au paramètre internal_domains.

2 « J'aime »

J’ai ajouté mon propre domaine à la configuration internal_domains et cela a résolu le problème.

2 « J'aime »

Je me demande si cette fonctionnalité fantastique pourrait être ajoutée aux liens de la barre latérale.

Nous avons plusieurs liens externes là-bas, et je pense qu’il serait une bonne idée de les styliser également. Peut-être sans modale et/ou restrictions, car la situation idéale est d’éviter les frictions inutiles (il s’agit de liens vérifiés).

Je suis curieux à ce sujet, car je ne suis pas sûr de bien comprendre le cas d’usage pour l’instant.

La barre latérale permet déjà d’attribuer une icône à chaque lien, et les liens ajoutés par un administrateur sont déjà vérifiés. Les sections de la barre latérale créées par les utilisateurs sont similaires en ce sens que l’utilisateur ajoute explicitement des liens qu’il connaît déjà et auxquels il fait confiance.

Je vois donc clairement l’intérêt d’appliquer le style des liens externes à cet endroit, mais je ne suis pas certain de la valeur supplémentaire que le composant apporterait au-delà du support existant des icônes dans la barre latérale, d’autant plus que vous avez mentionné ne pas vouloir de modale ni de restrictions.

Votre objectif principal serait-il simplement d’indiquer visuellement qu’un lien de la barre latérale pointe vers un site externe, en utilisant le même style/icône que le composant ?

1 « J'aime »

Merci d’avoir pris le temps d’envisager cette option. C’est exactement cela, le comportement souhaité est d’informer les utilisateurs qu’ils accéderont à une nouvelle page.