Afficher l'état de sécurité de tous les liens externes en utilisant l'API de recherche Google Safe Browsing

Il y a quelque temps, je cherchais une stratégie pour protéger mon site web des liens externes fournis par les membres du forum. J’essaie de créer ma propre base de données d’URL nuisibles. Mais c’est plus difficile qu’on ne le pense. Le volume énorme de liens est difficile à trier. J’ai donc cherché un service API qui pourrait répondre à mes besoins et j’ai découvert l’API Google Safe Browsing, un service API gratuit fourni par Google, et j’ai tenté de l’ajouter au forum Discourse.

Résultat sur mon forum
*lors du survol de la souris

Voici comment.
Pour ajouter une icône après tous les liens externes dans Discourse et afficher des infobulles montrant le statut de sécurité des liens à l’aide de l’API Google Safe Browsing Lookup (v4), suivez ces étapes :

  1. Créez une clé API pour Google Safe Browsing :

    • Accédez à la Google Cloud Console
    • Créez un nouveau projet ou utilisez-en un existant
    • Activez l’API Safe Browsing
    • Créez une clé API pour ce projet
      *Tout est gratuit.
  2. Connectez-vous à l’administration de Discourse :

    • Connectez-vous à Discourse avec votre compte administrateur
  3. Accédez à la personnalisation des thèmes :

    • Allez dans “Admin” → “Customize” → “Themes”
    • Sélectionnez le thème que vous souhaitez modifier ou créez un nouveau thème ou un composant de thème
  4. Ajoutez du CSS :

    • Cliquez sur “Edit CSS/HTML” pour le thème souhaité

    • Dans l’onglet “CSS”, ajoutez le code suivant :

      a[target="_blank"]:after {
          content: url('https://example.com/icon.png'); /* Remplacez par l'URL de votre icône souhaitée */
          margin-left: 5px; /* Espacement entre le lien et l'icône */
          display: inline-block;
      }
      
      .tooltip {
          position: relative;
          display: inline-block;
      }
      
      .tooltip .tooltiptext {
          visibility: hidden;
          width: 200px;
          background-color: #555;
          color: #fff;
          text-align: center;
          border-radius: 6px;
          padding: 5px;
          position: absolute;
          z-index: 1;
          bottom: 125%; /* Position de l'infobulle */
          left: 50%;
          margin-left: -100px;
          opacity: 0;
          transition: opacity 0.3s;
      }
      
      .tooltip:hover .tooltiptext {
          visibility: visible;
          opacity: 1;
      }
      
  5. Ajoutez du JavaScript :

    • Dans l’onglet “Header” du thème, ajoutez le code suivant :

      <script type="text/discourse-plugin" version="0.8">
        api.onPageChange(() => {
          const externalLinks = document.querySelectorAll('a[href^="http"]:not([href*="' + window.location.hostname + '"])');
          const apiKey = 'VOTRE_CLE_API_GOOGLE'; // Remplacez par votre clé API
          const lookupUrl = 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key=' + apiKey;
      
          externalLinks.forEach(link => {
            link.setAttribute('target', '_blank');
            link.classList.add('tooltip');
      
            const tooltipText = document.createElement('span');
            tooltipText.className = 'tooltiptext';
            tooltipText.innerText = 'Checking link safety...';
            link.appendChild(tooltipText);
      
            fetch(lookupUrl, {
              method: 'POST',
              headers: {
                'Content-Type': 'application/json'
              },
              body: JSON.stringify({
                client: {
                  clientId: 'yourcompany',
                  clientVersion: '1.5.2'
                },
                threatInfo: {
                  threatTypes: ['MALWARE', 'SOCIAL_ENGINEERING'],
                  platformTypes: ['ANY_PLATFORM'],
                  threatEntryTypes: ['URL'],
                  threatEntries: [
                    { url: link.href }
                  ]
                }
              })
            })
            .then(response => response.json())
            .then(data => {
              if (data.matches && data.matches.length > 0) {
                tooltipText.innerText = 'Warning: This link may be unsafe!';
                tooltipText.style.backgroundColor = '#ff0000';
              } else {
                tooltipText.innerText = 'This link is safe.';
              }
            })
            .catch(error => {
              tooltipText.innerText = 'Error checking link safety.';
            });
          });
        });
      </script>
      

      Ce JavaScript va :

      • Trouver tous les liens externes et les faire s’ouvrir dans un nouvel onglet
      • Ajouter une icône après le lien
      • Vérifier le lien à l’aide de l’API Google Safe Browsing et afficher le résultat dans une infobulle
  6. Enregistrez et appliquez le thème :

    • Cliquez sur “Save” pour enregistrer vos modifications
    • Si vous avez créé un nouveau thème, définissez-le comme thème par défaut ou attribuez-le aux groupes d’utilisateurs souhaités

Ces étapes garantiront que tous les liens externes de votre instance Discourse auront une icône après eux, et que des infobulles afficheront le statut de sécurité des liens à l’aide de l’API Google Safe Browsing.

Modification pour la sécurité
Vous devriez ajouter votre site web à la section des limites de sites web pour l’utilisation de l’API Google.

Option

Utiliser l'icône Font Awesome

Pour utiliser une icône de Font Awesome. Voici le CSS mis à jour :

CSS mis à jour avec les icônes Font Awesome

/* Assurez-vous que Font Awesome est inclus */
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css');

/* Ajouter l'icône Font Awesome après les liens externes */
a[target="_blank"]:after {
    content: "\\f35d"; /* Unicode pour l'icône de lien externe Font Awesome */
    font-family: 'Font Awesome 5 Free'; /* Famille Font Awesome */
    font-weight: 900; /* Poids solide de Font Awesome */
    margin-left: 5px; /* Espacement entre le lien et l'icône */
    display: inline-block;
}

Explication :

  1. Importation de Font Awesome :

    • Le CSS commence par importer le CSS de Font Awesome à partir d’un CDN.
  2. Ajout d’icône :

    • La propriété content dans le sélecteur a[target="_blank"]:after est définie sur \"\\f35d\", qui est l’Unicode de l’icône de lien externe Font Awesome.
    • La font-family est définie sur ‘Font Awesome 5 Free’ et font-weight sur 900 pour utiliser la version solide de l’icône.

J’espère que cela sera utile à ceux qui recherchent la même chose que moi.

3 « J'aime »

C’est une idée très cool !!

:warning: Notez qu’en incluant votre clé API Google Cloud dans un composant de thème, vous l’exposez au monde entier. Lorsque les gens ont accès à votre clé API, ils peuvent potentiellement vous facturer une facture très importante. :warning:
Vous devriez soit vous assurer que votre clé API est suffisamment limitée (par exemple, elle ne peut accéder qu’à l’API Safe Browsing), soit ajouter un proxy côté serveur afin de pouvoir garder la clé API en sécurité sur votre serveur.

3 « J'aime »

Ou … transformez ceci en plugin et maintenez la conversation API en coulisses, là où personne ne peut la voir.

1 « J'aime »

C’est ce que j’essayais de dire :wink:

2 « J'aime »

Un proxy est une sorte d’intermédiaire spécial et une bonne idée.\n\nC’était définitivement un OU.

1 « J'aime »

Merci pour ces excellents conseils. :blush: Je crois qu’il existe un mécanisme pour bloquer l’accès à l’API dans la Google Cloud Console ; ajoutez votre site web là-bas.

Parce que je manque des compétences nécessaires pour écrire des plugins. Je crois que cette stratégie est basique et directe. Mais s’il y a des gens qui souhaitent en créer, je pense que c’est supérieur à ma façon. Et j’en serai ravi.

1 « J'aime »

Et entre-temps, je proposerais même que cela vaille la peine d’être une demande de fonctionnalité.

(Si ce service est responsable, cela, je ne sais pas)

3 « J'aime »

Je ne fais aucune promesse mais quand j’aurai du temps libre dans les mois à venir, j’y réfléchirai certainement.

2 « J'aime »

Je suis ravi d’avoir retenu votre attention, et j’apprécie l’intérêt que vous avez manifesté pour la création de ce plugin.

J’espère et je suis heureux de voir cela dans la fonctionnalité également.

Quelqu’un sait si cela fonctionne avec la version auto-hébergée de Discourse ? Il ne semble pas y avoir d’option dans Admin pour « Personnaliser » les paramètres du thème.

Il n’y a pas de paramètres de thème sur ce thème, le fichier de paramètres est vide :

De plus, afin de modifier un thème téléchargé depuis GitHub, vous devez le forker, modifier votre fork et utiliser votre fork.

2 « J'aime »

Vous pouvez créer un nouveau composant de thème et l’ajouter à votre thème.

2 « J'aime »