API de SafetyNet Safe Browsing

La API de SafetyNet Safe Browsing, una biblioteca con tecnología de los Servicios de Google Play, proporciona servicios para determinar si Google marcó una URL como amenaza conocida.

Tu app puede usar esta API para determinar si Google clasificó una URL específica como una amenaza conocida. De forma interna, SafetyNet implementa un cliente para el protocolo de red de Navegación segura v4 que desarrolló Google. Tanto el código de cliente como el protocolo de red v4 se diseñaron para preservar la privacidad de los usuarios y mantener un consumo de batería y un ancho de banda mínimos. Usa esta API para aprovechar al máximo el servicio de Navegación segura de Google en Android de la manera más optimizada para recursos y sin implementar su protocolo de red.

En este documento, se explica cómo utilizar la API de SafetyNet Safe Browsing Lookup para verificar si una URL contiene amenazas conocidas.

Condiciones del Servicio

Cuando usas la API de Navegación segura, aceptas estar sujeto a las Condiciones del Servicio. Asegúrate de leer y entender todos los términos y las políticas aplicables antes de acceder a la API de Safe Browsing.

Cómo solicitar y registrar una clave de API de Android

Antes de usar la API de Navegación segura, crea y registra una clave de API de Android. Si quieres conocer los pasos específicos, consulta la página para comenzar a usar la Navegación segura.

Agrega la dependencia de la API de SafetyNet

Antes de usar la API de Navegación segura, agrega la API de SafetyNet a tu proyecto. Si usas Android Studio, agrega esta dependencia a tu archivo Gradle de nivel de app. Para obtener más información, consulta Protégete contra amenazas de seguridad con SafetyNet.

Cómo inicializar la API

Para usar la API de Safe Browsing, debes inicializar la API llamando a initSafeBrowsing() y esperar a que se complete. En el siguiente fragmento de código, se proporciona un ejemplo:

Kotlin

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

Java

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

Cómo solicitar una verificación de URL

Tu app puede usar una verificación de URL para determinar si una URL representa una amenaza conocida. Es posible que algunos tipos de amenazas no sean de interés para tu app en particular. La API te permite elegir qué tipos de amenazas son importantes para tus necesidades. Puedes especificar varios tipos de amenazas conocidas.

Cómo enviar la solicitud de verificación de URL

La API es independiente del esquema utilizado, de modo que puedes pasar la URL con un esquema o sin él. Por ejemplo, tanto

Kotlin

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

Java

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

como

Kotlin

var url = "www.google.com"

Java

String url = "www.google.com";

son válidos.

En el siguiente código, se muestra cómo enviar una solicitud de verificación de 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());
               }
           }
   });

Cómo leer la respuesta de verificación de URL

Con el objeto SafetyNetApi.SafeBrowsingResponse que se muestra, llama a su método getDetectedThreats(), que devuelve una lista de objetos SafeBrowsingThreat. Si la lista que se devuelve está vacía, significa la API no detectó ninguna amenaza conocida. Si la lista no está vacía, llama a getThreatType() en cada elemento de la lista para determinar qué amenazas conocidas detectó la API.

Si deseas ver el lenguaje de advertencia sugerido, consulta la Guía para desarrolladores sobre la API de Safe Browsing.

Cómo especificar tipos de amenazas de interés

Las constantes de la clase SafeBrowsingThreat incluyen los tipos de amenazas admitidos en ese momento:

Tipo de amenaza Definición
TYPE_POTENTIALLY_HARMFUL_APPLICATION Este tipo de amenaza identifica las URLs de las páginas marcadas por contener aplicaciones potencialmente dañinas.
TYPE_SOCIAL_ENGINEERING Este tipo de amenaza identifica las URLs de las páginas marcadas por contener amenazas de ingeniería social.

Cuando uses la API, agregarás constantes de tipo de amenaza como argumentos. Puedes agregar tantas constantes de tipo de amenaza como sea necesario para tu app, pero solo puedes usar las que no estén marcadas como obsoletas.

Cómo cerrar la sesión de Navegación segura

Si tu app no necesita usar la API de Safe Browsing durante un período prolongado, verifica todas las URL necesarias dentro de la app y, luego, cierra la sesión de Navegación segura con el comando shutdownSafeBrowsing():

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

Te recomendamos que llames a shutdownSafeBrowsing() en el método onPause() de tu actividad y que llames a initSafeBrowsing() en el método onResume() de tu actividad. Asegúrate de que initSafeBrowsing() haya terminado de ejecutarse antes de llamar a lookupUri(). Si te aseguras de que la sesión esté siempre actualizada, reduces la posibilidad de que se produzcan errores internos en la app.

Datos recopilados por la API de SafetyNet Safe Browsing

La API de SafetyNet Safe Browsing recopila los siguientes datos automáticamente cuando se comunica con el servicio de Navegación segura en Android:

Datos Descripción
Actividad en apps Recopila el prefijo de hash de las URLs después de la coincidencia de un prefijo de hash local para detectar URLs maliciosas.

Si bien nuestro objetivo es ser lo más transparentes que podamos, eres el único responsable de decidir cómo responder el formulario de la sección de Seguridad de los datos de Google Play en relación con las prácticas de seguridad, el uso compartido y la recopilación de datos del usuario de tu app.