Anzeigen des Sicherheitsstatus aller externen Links mithilfe der Google Safe Browsing Lookup API

Vor einiger Zeit suchte ich nach einer Strategie, um meine Website vor externen Links zu schützen, die von Forenmitgliedern bereitgestellt werden. Ich versuche, meine eigene Datenbank mit schädlichen URLs zu erstellen. Aber das ist schwieriger als man denkt. Die schiere Menge an Links ist schwer zu sortieren. Also suchte ich nach einem API-Dienst, der meinen Anforderungen entspricht, und entdeckte die Google Safe Browsing API, einen kostenlosen Dienst von Google, und versuchte, ihn in das Discourse-Forum zu integrieren.

Ergebnis in meinem Forum
*beim Überfahren mit der Maus

So geht’s.
Um nach allen externen Links in Discourse ein Symbol hinzuzufügen und Tooltips anzuzeigen, die den Sicherheitsstatus der Links mithilfe der Google Safe Browsing Lookup API (v4) anzeigen, befolgen Sie diese Schritte:

  1. Erstellen Sie einen API-Schlüssel für Google Safe Browsing:

    • Gehen Sie zur Google Cloud Console
    • Erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes
    • Aktivieren Sie die Safe Browsing API
    • Erstellen Sie einen API-Schlüssel für dieses Projekt
      *Es ist alles kostenlos.
  2. Melden Sie sich bei Discourse Admin an:

    • Melden Sie sich mit Ihrem Admin-Konto bei Discourse an
  3. Greifen Sie auf die Theme-Anpassung zu:

    • Gehen Sie zu “Admin” → “Anpassen” → “Themes”
    • Wählen Sie das Theme aus, das Sie bearbeiten möchten, oder erstellen Sie eine neue Theme oder eine Theme-Komponente
  4. CSS hinzufügen:

    • Klicken Sie für das gewünschte Theme auf “CSS/HTML bearbeiten”

    • Fügen Sie im Tab “CSS” den folgenden Code hinzu:

      a[target="_blank"]:after {
          content: url('https://example.com/icon.png'); /* Ersetzen Sie dies durch die URL Ihres gewünschten Icons */
          margin-left: 5px; /* Abstand zwischen dem Link und dem Icon */
          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 des Tooltips */
          left: 50%;
          margin-left: -100px;
          opacity: 0;
          transition: opacity 0.3s;
      }
      
      .tooltip:hover .tooltiptext {
          visibility: visible;
          opacity: 1;
      }
      
  5. JavaScript hinzufügen:

    • Fügen Sie im Tab “Header” des Themes den folgenden Code hinzu:

      <script type="text/discourse-plugin" version="0.8">
        api.onPageChange(() => {
          const externalLinks = document.querySelectorAll('a[href^="http"]:not([href*="' + window.location.hostname + '"])');
          const apiKey = 'YOUR_GOOGLE_API_KEY'; // Ersetzen Sie dies durch Ihren API-Schlüssel
          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>
      

      Dieses JavaScript wird:

      • Alle externen Links finden und so einstellen, dass sie in einem neuen Tab geöffnet werden
      • Ein Symbol nach dem Link hinzufügen
      • Den Link mithilfe der Google Safe Browsing API überprüfen und das Ergebnis in einem Tooltip anzeigen
  6. Speichern und Anwenden des Themes:

    • Klicken Sie auf “Speichern”, um Ihre Änderungen zu speichern
    • Wenn Sie ein neues Theme erstellt haben, legen Sie es als Standard-Theme fest oder weisen Sie es den gewünschten Benutzergruppen zu

Diese Schritte stellen sicher, dass alle externen Links in Ihrer Discourse-Instanz ein Symbol nach sich haben und Tooltips den Sicherheitsstatus der Links mithilfe der Google Safe Browsing API anzeigen.

Bearbeitung zur Sicherheit
Sie sollten Ihre Website im Abschnitt Website-Limits für die Google API-Nutzung hinzufügen.

Option

Font Awesome Icon verwenden

Um ein Icon von Font Awesome zu verwenden. Hier ist das aktualisierte CSS:

Aktualisiertes CSS mit Font Awesome Icons

/* Stellen Sie sicher, dass Font Awesome enthalten ist */
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css');

/* Font Awesome Icon nach externen Links hinzufügen */
a[target="_blank"]:after {
    content: "\f35d"; /* Unicode für Font Awesome externes Link-Icon */
    font-family: 'Font Awesome 5 Free'; /* Font Awesome Familie */
    font-weight: 900; /* Font Awesome Solid Gewicht */
    margin-left: 5px; /* Abstand zwischen dem Link und dem Icon */
    display: inline-block;
}

Erklärung:

  1. Font Awesome Import:

    • Das CSS beginnt mit dem Importieren des Font Awesome CSS von einem CDN.
  2. Icon-Hinzufügung:

    • Die content-Eigenschaft im Selektor a[target="_blank"]:after wird auf "\f35d" gesetzt, was der Unicode für das Font Awesome externe Link-Icon ist.
    • Die font-family ist auf ‘Font Awesome 5 Free’ und font-weight auf 900 gesetzt, um die solide Version des Icons zu verwenden.

Ich hoffe, das ist hilfreich für diejenigen, die dasselbe suchen wie ich.

3 „Gefällt mir“

Das ist eine sehr coole Idee!!

:warning: Beachten Sie, dass Sie Ihren Google Cloud API-Schlüssel preisgeben, wenn Sie ihn in eine Theme-Komponente aufnehmen. Wenn Personen Zugriff auf Ihren API-Schlüssel haben, können sie Ihnen potenziell eine sehr hohe Rechnung stellen. :warning:
Sie sollten entweder sicherstellen, dass Ihr API-Schlüssel ausreichend eingeschränkt ist (z. B. nur Zugriff auf die Safe Browsing API hat) oder einen serverseitigen Proxy hinzufügen, damit Sie den API-Schlüssel sicher auf Ihrem Server aufbewahren können.

3 „Gefällt mir“

Oder … verwandeln Sie dies in ein Plugin und lassen Sie die API-Konversation im Hintergrund laufen, wo niemand sie sehen kann.

1 „Gefällt mir“

Das habe ich versucht zu sagen :wink:

2 „Gefällt mir“

Nun, ein Proxy ist eine besondere Art von Mittelsmann und auch eine gute Idee.

Es war definitiv ein ODER.

1 „Gefällt mir“

Vielen Dank für den großartigen Rat. :blush: Ich glaube, es gibt einen Mechanismus, um den API-Zugriff in der Google Cloud Console zu blockieren; fügen Sie dort Ihre Website hinzu.

Da mir die notwendigen Fähigkeiten zum Schreiben von Plugins fehlen. Ich glaube, diese Strategie ist grundlegend und unkompliziert. Aber wenn es Leute gibt, die etwas erschaffen wollen, glaube ich, dass es meiner Methode überlegen ist. Und ich werde sehr begeistert sein.

1 „Gefällt mir“

Und ich würde sogar vorschlagen, dass dies eine Feature-Anfrage wert sein könnte.

(Ob dieser Dienst haftbar ist, das weiß ich nicht)

3 „Gefällt mir“

Ich mache keine Versprechungen, aber wenn ich in den kommenden Monaten etwas Freizeit habe, werde ich dies auf jeden Fall in Betracht ziehen.

2 „Gefällt mir“

Es freut mich, dass ich Ihre Aufmerksamkeit erregt habe, und ich schätze das Interesse, das Sie an der Entwicklung dieses Plugins gezeigt haben.

Ich hoffe und freue mich, dies auch in den Funktionen zu sehen.

Weiß jemand, ob dies mit der selbst gehosteten Version von Discourse funktioniert? Es scheint keine Option in Admin zu geben, um die Theme-Einstellungen zu “Anpassen”.

Für dieses Theme gibt es keine Theme-Einstellungen, die Einstellungsdatei ist leer:

Außerdem müssen Sie, um ein von GitHub heruntergeladenes Theme zu ändern, es forken, Ihre Kopie bearbeiten und Ihre Kopie verwenden.

2 „Gefällt mir“

Sie können eine neue Themenkomponente erstellen und diese zu Ihrem Thema hinzufügen

2 „Gefällt mir“