SafetyNet proporciona servicios para determinar si Google marcó una URL como una 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 usar SafetyNet para verificar una URL en busca de 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 las API de Navegación segura.
Cómo solicitar y registrar una clave de API de Android
Para crear una clave de API, sigue estos pasos:
- Ve a Google Developers Console.
- En la barra de herramientas superior, elige Seleccionar un proyecto > nombre-del-proyecto.
- En el cuadro de búsqueda, ingresa API de Navegación segura; cuando aparezca el nombre de la API de Navegación segura en la tabla, selecciónalo.
- Cuando se vuelva a mostrar la página, selecciona Enable y, luego, Go to Credentials.
- Cuando aparezca la ventana Add credentials to your project, elige tus parámetros y selecciona ¿Qué credenciales necesito?.
- Ingresa un nombre para tu clave de API y, luego, selecciona Create API key.
-
Aparecerá la nueva clave de API; cópiala y guárdala para usarla más adelante.
Nota: La clave de API te permite realizar una verificación de URL 10,000 veces al día. En ese caso, la clave debería ser solo una string hexadecimal, no parte de una URL.
- Selecciona Listo para completar el proceso.
Si necesitas más ayuda, consulta el Centro de ayuda de Google Developers Console.
Cómo inicializar la API
Para usar la API de Navegación segura, 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());
Nota: Para minimizar el impacto de la inicialización de tu app, llama a initSafeBrowsing()
lo antes posible en el método onResume()
de tu actividad.
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 especificar tipos de amenazas de interés
Las constantes de la clase SafeBrowsingThreat
incluyen los tipos de amenazas admitidos en ese momento:
package com.google.android.gms.safetynet; public class SafeBrowsingThreat { /** * This threat type identifies URLs of pages that are flagged as containing potentially * harmful applications. */ public static final int TYPE_POTENTIALLY_HARMFUL_APPLICATION = 4; /** * This threat type identifies URLs of pages that are flagged as containing social * engineering threats. */ public static final int TYPE_SOCIAL_ENGINEERING = 5; }
Cuando uses la API, deberás usar constantes que no estén marcadas como obsoletas. Debes agregar constantes de tipo de amenaza como argumentos a la API y puedes agregar tantas como requiera tu app.
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.
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 muestra una lista de objetos SafeBrowsingThreat
. Si la lista que se muestra está vacía, significa la API no detectó ninguna amenaza conocida. Sin embargo, si la lista no está vacía, llama a getThreatType()
en cada elemento de la lista para determinar qué amenazas conocidas detectó.
Cómo cerrar la sesión de Navegación segura
Si tu app no va a usar la API de Navegación segura durante un período prolongado, verifica todas las URL necesarias dentro de la app y, luego, cierra la sesión de Navegación segura usando el método shutdownSafeBrowsing()
:
Kotlin
SafetyNet.getClient(this).shutdownSafeBrowsing()
Java
SafetyNet.getClient(this).shutdownSafeBrowsing();
Te recomendamos que llames al shutdownSafeBrowsing()
en el método onPause()
de tu actividad y que llames a initSafeBrowsing()
en el método onResume()
de tu actividad. Sin embargo, debes asegurarte de que initSafeBrowsing()
haya terminado de ejecutarse antes de llamar a lookupUri()
. Si te aseguras de que la sesión esté siempre actualizada, ayudarás a reducir los errores internos de tu app.
Lenguaje de advertencia sugerido
Si deseas ver el lenguaje de advertencia sugerido, consulta la Guía para desarrolladores sobre la API de Navegación segura.