SafetyNet Güvenli Tarama API'si

Google Play Hizmetleri tarafından desteklenen bir kitaplık olan SafetyNet Güvenli Tarama API'si, bir URL'nin Google tarafından bilinen bir tehdit olarak işaretlenip işaretlenmediğini belirlemeye yönelik hizmetler sunar.

Uygulamanız, belirli bir URL'nin Google tarafından bilinen bir tehdit olarak sınıflandırılıp sınıflandırılmadığını belirlemek için bu API'yi kullanabilir. SafetyNet, Google tarafından geliştirilen Güvenli Tarama Ağı Protokolü v4 için dahili olarak bir istemci uygular. Hem istemci kodu hem de v4 ağ protokolü, kullanıcıların gizliliğini korumak ve pil ile bant genişliği tüketimini minimumda tutmak için tasarlanmıştır. Bu API'yi kullanarak Google'ın Android'deki Güvenli Tarama hizmetinden en iyi şekilde yararlanabilir, kaynakları en iyi şekilde optimize edebilir ve ağ protokolünü uygulamadan kullanabilirsiniz.

Yeni 5. sürüm (v5) güncellemesi, Oblivious HTTP kullanımıyla veri güncelliği ve gizlilik konusunda önemli iyileştirmeler sunuyor.

Bu belgede, bilinen tehditler için URL'leri kontrol etmek üzere SafetyNet Güvenli Tarama Arama API'sinin nasıl kullanılacağı açıklanmaktadır.

Hizmet şartları

Güvenli Tarama API'sini kullanarak Hizmet Şartları'na tabi olmayı kabul edersiniz. Güvenli Tarama API'sine erişmeden önce geçerli tüm şartları ve politikaları okuyup anladığınızdan emin olun.

Android API anahtarı isteme ve kaydetme

Güvenli Tarama API'sini kullanmadan önce bir Android API anahtarı oluşturup kaydedin. Belirli adımlar için Güvenli Tarama'yı kullanmaya başlama başlıklı sayfayı inceleyin.

v5'te, SafeBrowsingClient örneğini oluştururken bu API anahtarını sağlarsınız.

SafetyNet API bağımlılığını ekleyin

Güvenli Tarama API'yi kullanmadan önce SafetyNet API'yi projenize ekleyin. Android Studio kullanıyorsanız bu bağımlılığı uygulama düzeyindeki Gradle dosyanıza ekleyin. Daha fazla bilgi için SafetyNet ile güvenlik tehditlerine karşı korunma başlıklı makaleyi inceleyin.

API'yi başlatma

Safe Browsing API'yi kullanmak için initSafeBrowsing çağrısı yaparak API'yi başlatmanız ve tamamlanmasını beklemeniz gerekir. Aşağıdaki kod snippet'inde bir örnek verilmiştir:

Kotlin

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

Java

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

GmsCore, v5'te Güvenli Tarama istemcisini sunar. SafeBrowsingClient örneği edinmeniz gerekir. Verimliliği artırmak ve şişkinliği azaltmak için API yüzeyini basitleştirdik.

// 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 kontrolü isteğinde bulunma

Bir URI'nin tehdit oluşturup oluşturmadığını kontrol etmek için lookupUri yöntemini kullanın. Yerel engellenenler listesi (v4) veya anlık koruma (v5) olabilen amaçlanan protokolü belirtmeniz gerekir.

URL kontrolü isteğini gönderin

API, kullanılan şemadan bağımsızdır. Bu nedenle, URL'yi şemayla veya şemasız olarak iletebilirsiniz. Örneğin, her ikisi de

Kotlin

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

Java

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

ve

Kotlin

var url = "www.google.com"

Java

String url = "www.google.com";

geçerli olmalıdır.

Aşağıdaki kodda, URL kontrolü isteğinin nasıl gönderileceği gösterilmektedir:

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());
               }
           }
   });

Güncellenen lookupUri imzası; URI'yi, tehdit türlerinin listesini ve protokolü alır.

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 kontrolü yanıtını okuma

Döndürülen SafetyNetApi.SafeBrowsingResponse nesnesini kullanarak getDetectedThreats yöntemini çağırın. Bu yöntem, SafeBrowsingThreat nesnelerinin listesini döndürür. Döndürülen liste boşsa API, bilinen herhangi bir tehdit algılamamıştır. Liste boş değilse API'nin hangi bilinen tehditleri tespit ettiğini belirlemek için listedeki her öğede getThreatType çağrısı yapın.

Önerilen uyarı dilini görmek için Güvenli Tarama API Geliştirici Kılavuzu'na bakın.

İlgilendiğiniz tehdit türlerini belirtin

SafeBrowsingThreat sınıfındaki sabitler, şu anda desteklenen tehdit türlerini içerir:

Tehdit türü Tanım
TYPE_POTENTIALLY_HARMFUL_APPLICATION Bu tehdit türü, zararlı olabilecek uygulamalar içerdiği için işaretlenen sayfaların URL'lerini tanımlar.
TYPE_SOCIAL_ENGINEERING Bu tehdit türü, sosyal mühendislik tehditleri içerdiği için işaretlenen sayfaların URL'lerini tanımlar.

API'yi kullanırken tehdit türü sabitlerini bağımsız değişken olarak eklersiniz. Uygulamanızın gerektirdiği kadar çok tehdit türü sabiti ekleyebilirsiniz ancak yalnızca kullanımdan kaldırılmış olarak işaretlenmemiş sabitleri kullanabilirsiniz.

Güvenli Tarama oturumunuzu kapatma

Uygulamanızın uzun süre Güvenli Tarama API'sini kullanması gerekmiyorsa uygulamanızdaki gerekli tüm URL'leri kontrol edin ve ardından shutdownSafeBrowsing yöntemini kullanarak Güvenli Tarama oturumunuzu kapatın:

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

Etkinliğinizin onPause yönteminde shutdownSafeBrowsing'yı, etkinliğinizin onResume yönteminde ise initSafeBrowsing'ı çağırmanızı öneririz. Ancak, lookupUri işlevini çağırmadan önce initSafeBrowsing işlevinin yürütülmesinin tamamlandığından emin olun. Oturumunuzun her zaman güncel olmasını sağlayarak uygulamanızdaki dahili hataların olasılığını azaltırsınız.

Anlık koruma ayrıntıları

v5 güncellemesi, veri eskime sorunlarını (v4'te 20-50 dakikaya kadar çıkabilen) önleyen bir gerçek zamanlı koruma modu sunar. Bu protokol, varsayılan olarak izin ver yerine varsayılan olarak kontrol et protokolüne geçerek hızla yayılan tehditlere karşı korumayı artırır. Gerçek zamanlı modda, istemciler en yeni tehdit verileriyle neredeyse gerçek zamanlı koruma sağlamak için yerel bir veritabanı ve büyük olasılıkla zararsız sitelerin global önbelleğini tutar.

Desteklenen tehdit türleri

API, ihtiyaçlarınız için hangi tehdit türlerinin önemli olduğunu seçmenize olanak tanır. V5 API, daha geniş bir tehdit türü aralığını destekler:

Tehdit Türü Sabiti Açıklama
NO_THREAT Tehdit yok.
TYPE_MALWARE Genel kötü amaçlı yazılım tehditleri.
TYPE_UNWANTED_SOFTWARE İstenmeyen yazılımlar veya uygulamalar
TYPE_POTENTIALLY_HARMFUL_APPLICATION Cihaza veya kullanıcıya zarar verebilecek uygulamalar.
TYPE_SOCIAL_ENGINEERING Kimlik avı ve diğer aldatıcı siteler
TYPE_TRICK_TO_BILL Kullanıcıları faturalandırma işlemleri yapmaya yönlendiren sayfalar.
TYPE_BETTER_ADS_VIOLATION Better Ads Standartları'nı ihlal eden siteler.
TYPE_MALWARE_OFFLINE Çevrimdışı kötü amaçlı yazılım.
TYPE_ABUSIVE_EXPERIENCE_VIOLATION Kullanıcı için kötü bir deneyime yol açan ihlaller.
TYPE_HIGH_CONFIDENCE_ALLOW_LIST Yüksek güvenilirlikli izin verilenler listesi

SafetyNet Güvenli Tarama API'si tarafından toplanan veriler

SafetyNet Güvenli Tarama API'si, Android'deki Güvenli Tarama hizmetiyle iletişim kurduğunda aşağıdaki verileri otomatik olarak toplar:

Veriler Açıklama
Uygulama Etkinliği Kötü amaçlı URL'leri tespit etmek amacıyla, yerel karma ön eki eşleşmesinden sonra URL'lerin karma ön ekini toplar.

SafetyNet Güvenli Tarama API, kötü amaçlı URL'leri tespit etmek için URL'lerin karma ön ekini toplar. 5. sürüm, bu aramalar sırasında kullanıcı verilerini daha fazla korumak için Oblivious HTTP'yi uygular.

Olabildiğince şeffaf olmayı hedeflesek de uygulamanızın kullanıcı verilerini toplama, paylaşma ve güvenlikle ilgili yaklaşımları hakkında Google Play'in Veri Güvenliği bölümü formuna nasıl yanıt vereceğinize karar vermek tamamen sizin sorumluluğunuzdadır.