عرض حالة الأمان في جميع الروابط الخارجية باستخدام API استعلام Google Safe Browsing

منذ فترة، كنت أبحث عن استراتيجية لحماية موقعي من الروابط الخارجية التي يقدمها أعضاء المنتدى. أحاول إنشاء قاعدة بيانات خاصة بي للروابط الضارة. لكن الأمر أصعب مما تعتقد. الحجم الهائل للروابط يصعب فرزه. لذلك بحثت عن خدمة API تناسب متطلباتي واكتشفت Google Safe Browsing API، وهي خدمة API مجانية تقدمها Google، وحاولت إضافتها إلى منتدى Discourse.

النتيجة في منتدى
عند تمرير الماوس

إليك الطريقة.
لإضافة أيقونة بعد جميع الروابط الخارجية في Discourse وعرض تلميحات تظهر حالة أمان الروابط باستخدام Google Safe Browsing Lookup API (v4)، اتبع الخطوات التالية:

  1. إنشاء مفتاح API لـ Google Safe Browsing:

    • انتقل إلى Google Cloud Console
    • أنشئ مشروعًا جديدًا أو استخدم مشروعًا موجودًا
    • قم بتمكين Safe Browsing API
    • أنشئ مفتاح API لهذا المشروع
    • كل هذا مجاني.
  2. تسجيل الدخول إلى Discourse Admin:

    • قم بتسجيل الدخول إلى Discourse باستخدام حساب المسؤول الخاص بك
  3. الوصول إلى تخصيص المظهر:

    • انتقل إلى “Admin” → “Customize” → “Themes”
    • اختر المظهر الذي تريد تعديله أو أنشئ مظهرًا جديدًا أو مكون مظهر
  4. إضافة CSS:

    • انقر على “Edit CSS/HTML” للمظهر المطلوب
    • في علامة التبويب “CSS”، أضف الكود التالي:
    a[target="_blank"]:after {
        content: url('https://example.com/icon.png'); /* استبدل هذا بعنوان URL للأيقونة التي تريدها */
        margin-left: 5px; /* المسافة بين الرابط والأيقونة */
        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%; /* موضع التلميح */
        left: 50%;
        margin-left: -100px;
        opacity: 0;
        transition: opacity 0.3s;
    }
    
    .tooltip:hover .tooltiptext {
        visibility: visible;
        opacity: 1;
    }
    
  5. إضافة JavaScript:

    • في علامة التبويب “Header” للمظهر، أضف الكود التالي:
    <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'; // استبدل هذا بمفتاح 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>
    

    سيقوم هذا JavaScript بما يلي:

    • البحث عن جميع الروابط الخارجية وتعيينها لفتحها في علامة تبويب جديدة
    • إضافة أيقونة بعد الرابط
    • التحقق من الرابط باستخدام Google Safe Browsing API وعرض النتيجة في تلميح
  6. حفظ وتطبيق المظهر:

    • انقر على “Save” لحفظ التغييرات
    • إذا أنشأت مظهرًا جديدًا، قم بتعيينه كمظهر افتراضي أو قم بتعيينه لمجموعات المستخدمين المطلوبة

ستضمن هذه الخطوات أن جميع الروابط الخارجية في مثيل Discourse الخاص بك سيكون لها أيقونة بعدها، وستعرض التلميحات حالة أمان الروابط باستخدام Google Safe Browsing API.

تعديل للأمان
يجب عليك إضافة موقعك إلى قسم حدود الموقع لاستخدام Google API.

خيار

استخدام أيقونة Font Awesome

لاستخدام أيقونة من Font Awesome. إليك CSS المحدث:

CSS المحدث بأيقونات Font Awesome

/* تأكد من تضمين Font Awesome */
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css');

/* إضافة أيقونة Font Awesome بعد الروابط الخارجية */
a[target="_blank"]:after {
    content: "\\f35d"; /* Unicode لأيقونة الرابط الخارجي Font Awesome */
    font-family: 'Font Awesome 5 Free'; /* عائلة Font Awesome */
    font-weight: 900; /* وزن Font Awesome الصلب */
    margin-left: 5px; /* المسافة بين الرابط والأيقونة */
    display: inline-block;
}

شرح:

  1. استيراد Font Awesome:

    • يبدأ CSS باستيراد CSS الخاص بـ Font Awesome من CDN.
  2. إضافة الأيقونة:

    • تم تعيين خاصية content في محدد a[target="_blank"]:after إلى \"\\f35d\"، وهو Unicode لأيقونة الرابط الخارجي لـ Font Awesome.
    • تم تعيين font-family إلى ‘Font Awesome 5 Free’ و font-weight إلى 900 لاستخدام النسخة الصلبة من الأيقونة.

آمل أن يكون هذا مفيدًا لمن يبحث عن نفس الشيء مثلي.

3 إعجابات

هذه فكرة رائعة جدًا!!

:warning: لاحظ أن تضمين مفتاح واجهة برمجة تطبيقات Google Cloud الخاص بك في مكون سمة يعرضه للعالم. عندما يتمكن الأشخاص من الوصول إلى مفتاح واجهة برمجة التطبيقات الخاص بك، فيمكنهم إحتمال أن يضعوك في فاتورة كبيرة جدًا. :warning:
يجب عليك إما التأكد من أن مفتاح واجهة برمجة التطبيقات الخاص بك له نطاق كافٍ (على سبيل المثال، لا يمكنه الوصول إلا إلى واجهة برمجة تطبيقات Safe Browsing) أو يجب عليك إضافة وكيل من جانب الخادم حتى تتمكن من الحفاظ على مفتاح واجهة برمجة التطبيقات آمنًا على الخادم الخاص بك.

3 إعجابات

أو … قم بتحويل هذا إلى إضافة (plugin) وحافظ على محادثة واجهة برمجة التطبيقات (API) تحدث في الخلفية حيث لا يمكن لأحد رؤيتها.

إعجاب واحد (1)

هذا ما حاولت قوله :wink:

إعجابَين (2)

حسنًا، الوكيل هو نوع خاص من الوسطاء وهو أيضًا فكرة جيدة.

لقد كان بالتأكيد OR.

إعجاب واحد (1)

شكرًا لك على النصيحة الرائعة. :blush: أعتقد أن هناك آلية لحظر الوصول إلى واجهة برمجة التطبيقات في Google Cloud Console؛ أضف موقعك الإلكتروني هناك.

لأنني أفتقر إلى المهارات اللازمة لكتابة الإضافات (plugins). أعتقد أن هذه الاستراتيجية أساسية ومباشرة. ولكن إذا كان هناك أشخاص يرغبون في الإنشاء، أعتقد أنها أفضل من طريقتي. وسأكون مسرورًا للغاية.

إعجاب واحد (1)

وفي الوقت نفسه، أقترح أن هذا قد يستحق طلب ميزة.

(إذا كانت هذه الخدمة مسؤولة، فلا أعرف)

3 إعجابات

لا أقدم أي وعود، ولكن عندما يكون لدي بعض الوقت الإضافي في الأشهر القادمة، سأضع ذلك في الاعتبار بالتأكيد.

إعجابَين (2)

يسعدني أن ألفت انتباهك، وأقدر الاهتمام الذي أظهرته في صنع هذه الإضافة.

آمل ويسعدني رؤية هذا في الميزة أيضًا.

هل يعرف أي شخص ما إذا كان هذا يعمل مع الإصدار المستضاف ذاتيًا من Discourse؟ لا يبدو أن هناك خيارًا في المسؤول لتخصيص إعدادات السمة.

لا توجد إعدادات للمظهر في هذا المظهر، ملف الإعدادات فارغ:

بالإضافة إلى ذلك، لتغيير مظهر تم تنزيله من GitHub، تحتاج إلى عمل نسخة منه، وتعديل نسختك واستخدام نسختك.

إعجابَين (2)

يمكنك إنشاء مكون سمة جديد وإضافته إلى السمة الخاصة بك

إعجابَين (2)