واجهة برمجة تطبيقات SafetyNet للتصفّح الآمن

توفّر SafetyNet Safe Browsing API، وهي مكتبة تستند إلى خدمات Google Play، خدمات لتحديد ما إذا كانت Google قد صنّفت عنوان URL على أنّه تهديد معروف.

يمكن لتطبيقك استخدام واجهة برمجة التطبيقات هذه لتحديد ما إذا صنّفت Google عنوان URL معيّنًا على أنّه تهديد معروف. تستخدم SafetyNet داخليًا برنامجًا للعميل من أجل بروتوكول شبكة التصفح الآمن v4 الذي طوّرته Google. تم تصميم كلّ من رمز برنامج العميل وبروتوكول الشبكة v4 للحفاظ على خصوصية المستخدمين وتقليل استهلاك البطارية والنطاق الترددي إلى الحد الأدنى. استخدِم واجهة برمجة التطبيقات هذه للاستفادة بشكل كامل من خدمة "التصفّح الآمن من Google" على Android بأكثر الطرق فعالية من حيث استخدام الموارد، وبدون تنفيذ بروتوكول الشبكة الخاص بها.

يقدّم الإصدار 5 (الإصدار v5) الجديد تحسينات كبيرة في ما يتعلّق بحداثة البيانات والخصوصية من خلال استخدام بروتوكول HTTP غير الواعي.

يوضّح هذا المستند كيفية استخدام SafetyNet Safe Browsing Lookup API لفحص عنوان URL بحثًا عن التهديدات المعروفة.

بنود الخدمة

باستخدام Safe Browsing API، أنت توافق على الالتزام ببنود الخدمة . يُرجى قراءة جميع البنود والسياسات السارية وفهمها قبل الوصول إلى Safe Browsing API.

طلب مفتاح Android API وتسجيله

قبل استخدام Safe Browsing API، عليك إنشاء مفتاح Android API وتسجيله. للاطّلاع على الخطوات المحدّدة، يُرجى الانتقال إلى صفحة البدء في استخدام "التصفّح الآمن".

في الإصدار v5، عليك تقديم مفتاح واجهة برمجة التطبيقات هذا عند إنشاء مثيل SafeBrowsingClient.

إضافة تبعية SafetyNet API

قبل استخدام Safe Browsing API، عليك إضافة SafetyNet API إلى مشروعك. إذا كنت تستخدم "استوديو Android"، عليك إضافة هذه التبعية إلى ملف Gradle على مستوى التطبيق. لمزيد من المعلومات، يُرجى الاطّلاع على الحماية من التهديدات الأمنية باستخدام SafetyNet.

إعداد واجهة برمجة التطبيقات

لاستخدام Safe Browsing API، عليك إعدادها من خلال استدعاء initSafeBrowsing والانتظار إلى أن تكتمل العملية. يقدّم مقتطف الرمز البرمجي التالي مثالاً على ذلك:

Kotlin

Tasks.await(SafetyNet.getClient(this).initSafeBrowsing)

Java

Tasks.await(SafetyNet.getClient(this).initSafeBrowsing);

في الإصدار v5، يقدّم GmsCore برنامج التصفح الآمن للعميل. عليك الحصول على مثيل SafeBrowsingClient. لقد بسّطنا واجهة برمجة التطبيقات لزيادة الكفاءة وتقليل حجمها.

// Draft interface for the new client
public interface SafeBrowsingClient extends HasApiKey<SafeBrowsingApiOptions> {
  Task<SafeBrowsingResponse> lookupUri(String uri, @ThreatType List<Integer> threatTypes, @Protocol int protocol);
  Task<SupportedThreatTypesResponse> getSupportedThreatTypes();
}

طلب فحص عنوان URL

استخدِم طريقة lookupUri لمعرفة ما إذا كان معرّف URI يمثّل تهديدًا. عليك تحديد البروتوكول المقصود، الذي يمكن أن يكون القائمة المحلية المحظورة (الإصدار v4) أو الحماية في الوقت الفعلي (الإصدار v5) .

إرسال طلب فحص عنوان URL

لا تعتمد واجهة برمجة التطبيقات على المخطط المستخدَم، لذا يمكنك تمرير عنوان URL مع مخطط أو بدونه. على سبيل المثال، يكون كلّ من

Kotlin

var url = "https://www.google.com"

Java

String url = "https://www.google.com";

و

Kotlin

var url = "www.google.com"

Java

String url = "www.google.com";

صالحَين.

يوضّح الرمز البرمجي التالي كيفية إرسال طلب فحص عنوان URL:

Kotlin

SafetyNet.getClient(this).lookupUri(
       url,
       SAFE_BROWSING_API_KEY,
       SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
       SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING
)
       .addOnSuccessListener(this) { sbResponse ->
           // Indicates communication with the service was successful.
           // Identify any detected threats.
           if (sbResponse.detectedThreats.isEmpty()) {
               // No threats found.
           } else {
               // Threats found!
           }
       }
       .addOnFailureListener(this) { e: Exception ->
           if (e is ApiException) {
               // An error with the Google Play services API contains some
               // additional details.
               Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")

               // Note: If the status code, s.statusCode,
               // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
               // you need to call initSafeBrowsing(). It means either you
               // haven't called initSafeBrowsing() before or that it needs
               // to be called again due to an internal error.
           } else {
               // A different, unknown type of error occurred.
               Log.d(TAG, "Error: ${e.message}")
           }
       }

Java

SafetyNet.getClient(this).lookupUri(url,
         SAFE_BROWSING_API_KEY,
         SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
         SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING)
   .addOnSuccessListener(this,
       new OnSuccessListener<SafetyNetApi.SafeBrowsingResponse>() {
           @Override
           public void onSuccess(SafetyNetApi.SafeBrowsingResponse sbResponse) {
               // Indicates communication with the service was successful.
               // Identify any detected threats.
               if (sbResponse.getDetectedThreats().isEmpty()) {
                   // No threats found.
               } else {
                   // Threats found!
               }
        }
   })
   .addOnFailureListener(this, new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               // An error occurred while communicating with the service.
               if (e instanceof ApiException) {
                   // An error with the Google Play services API contains some
                   // additional details.
                   ApiException apiException = (ApiException) e;
                   Log.d(TAG, "Error: " + CommonStatusCodes
                       .getStatusCodeString(apiException.getStatusCode()));

                   // Note: If the status code, apiException.getStatusCode(),
                   // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
                   // you need to call initSafeBrowsing(). It means either you
                   // haven't called initSafeBrowsing() before or that it needs
                   // to be called again due to an internal error.
               } else {
                   // A different, unknown type of error occurred.
                   Log.d(TAG, "Error: " + e.getMessage());
               }
           }
   });

تأخذ توقيع lookupUri المعدَّل معرّف URI وقائمة بأنواع التهديدات والبروتوكول.

val threatTypes = listOf(ThreatType.TYPE_SOCIAL_ENGINEERING, ThreatType.TYPE_MALWARE)
val protocol = Protocol.REAL_TIME // or Protocol.LOCAL_BLOCK_LIST

safeBrowsingClient.lookupUri(url, threatTypes, protocol)
    .addOnSuccessListener { response ->
        if (response.detectedThreats.isEmpty()) {
            // No threats found
        } else {
            // Threats detected!
        }
    }

قراءة الردّ على طلب فحص عنوان URL

باستخدام عنصر SafetyNetApi.SafeBrowsingResponse الذي تم عرضه، استدعِ طريقة getDetectedThreats التي تعرض قائمة بعناصر SafeBrowsingThreat. إذا كانت القائمة المعروضة فارغة، لم ترصد واجهة برمجة التطبيقات أي تهديدات معروفة. إذا لم تكن القائمة فارغة، استدعِ getThreatType على كل عنصر في القائمة لتحديد التهديدات المعروفة التي رصدتها واجهة برمجة التطبيقات.

للاطّلاع على لغة التحذير المقترَحة، يُرجى الرجوع إلى دليل مطوّري Safe Browsing API.

تحديد أنواع التهديدات التي تهمّك

تحتوي الثوابت في فئة SafeBrowsingThreat على أنواع التهديدات المتاحة حاليًا:

نوع التهديد التعريف
TYPE_POTENTIALLY_HARMFUL_APPLICATION يحدّد هذا النوع من التهديدات عناوين URL للصفحات التي تم وضع علامة عليها على أنّها تحتوي على تطبيقات قد تكون ضارة.
TYPE_SOCIAL_ENGINEERING يحدّد هذا النوع من التهديدات عناوين URL للصفحات التي تم وضع علامة عليها على أنّها تحتوي على تهديدات الهندسة الاجتماعية.

عند استخدام واجهة برمجة التطبيقات، عليك إضافة ثوابت نوع التهديد كمعلّمات. يمكنك إضافة أي عدد من ثوابت نوع التهديد حسب متطلبات تطبيقك، ولكن يمكنك استخدام الثوابت التي لم يتم وضع علامة عليها على أنّها متوقفة نهائيًا فقط.

إيقاف جلسة "التصفّح الآمن"

إذا لم يكن تطبيقك بحاجة إلى استخدام Safe Browsing API لفترة طويلة، عليك فحص جميع عناوين URL اللازمة داخل تطبيقك ثم إيقاف جلسة "التصفّح الآمن" باستخدام shutdownSafeBrowsing طريقة:

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

ننصحك باستدعاء shutdownSafeBrowsing في طريقة onPause لنشاطك واستدعاء initSafeBrowsing في طريقة onResume لنشاطك. ومع ذلك، عليك التأكّد من اكتمال تنفيذ initSafeBrowsingقبل استدعاء lookupUri من خلال التأكّد من أنّ جلستك حديثة دائمًا، يمكنك تقليل احتمالية حدوث أخطاء داخلية في تطبيقك.

تفاصيل الحماية في الوقت الفعلي

يقدّم الإصدار v5 وضع الحماية في الوقت الفعلي الذي يتجنّب مشاكل عدم حداثة البيانات (التي يمكن أن تصل إلى 20 إلى 50 دقيقة في الإصدار v4). يتحوّل هذا الوضع من بروتوكول السماح تلقائيًا إلى بروتوكول الفحص تلقائيًا ، ما يعزّز الحماية من التهديدات التي تنتشر بسرعة. في وضع الوقت الفعلي، تحتفظ برامج العملاء بقاعدة بيانات محلية وذاكرة تخزين مؤقت عالمية للمواقع الإلكترونية التي يُرجّح أن تكون غير ضارة لتوفير حماية في الوقت الفعلي تقريبًا باستخدام أحدث بيانات التهديدات.

أنواع التهديدات المتاحة

تتيح لك واجهة برمجة التطبيقات اختيار أنواع التهديدات المهمة لاحتياجاتك. تتيح واجهة برمجة التطبيقات v5 نطاقًا أوسع من أنواع التهديدات:

ثابت نوع التهديد الوصف
NO_THREAT لا يوجد تهديد.
TYPE_MALWARE التهديدات العامة للبرامج الضارة.
TYPE_UNWANTED_SOFTWARE البرامج أو التطبيقات غير المرغوب فيها.
TYPE_POTENTIALLY_HARMFUL_APPLICATION التطبيقات التي قد تضر بالجهاز أو المستخدم.
TYPE_SOCIAL_ENGINEERING التصيّد الاحتيالي والمواقع الإلكترونية المخادعة الأخرى.
TYPE_TRICK_TO_BILL الصفحات التي تخدع المستخدمين لاتخاذ إجراءات متعلقة بالفوترة.
TYPE_BETTER_ADS_VIOLATION المواقع الإلكترونية التي تنتهك معايير Better Ads.
TYPE_MALWARE_OFFLINE البرامج الضارة بلا إنترنت.
TYPE_ABUSIVE_EXPERIENCE_VIOLATION الانتهاكات التي تؤدي إلى تجربة سيئة للمستخدم.
TYPE_HIGH_CONFIDENCE_ALLOW_LIST قائمة السماح بدرجة عالية من الثقة

البيانات التي تجمعها SafetyNet Safe Browsing API

تجمع SafetyNet Safe Browsing API البيانات التالية تلقائيًا عند التواصل مع خدمة "التصفّح الآمن" على Android:

البيانات الوصف
النشاط على التطبيق يتم جمع بادئة التجزئة لعناوين URL بعد مطابقة بادئة التجزئة المحلية لـ أغراض رصد عناوين URL الضارة.

تجمع SafetyNet Safe Browsing API بادئة التجزئة لعناوين URL لرصد عناوين URL الضارة. ويستخدم الإصدار 5 بروتوكول HTTP غير الواعي لزيادة حماية بيانات المستخدم أثناء عمليات البحث هذه.

نسعى إلى الالتزام بالشفافية قدر الإمكان، ولكنّك وحدك المسؤول عن تحديد كيفية ملء نموذج قسم "أمان البيانات" في Google Play بشأن ممارسات جمع بيانات المستخدمين ومشاركتها وأمانها في تطبيقك.