API SafetyNet Safe Browsing

A API SafetyNet Navegação segura, uma biblioteca com tecnologia do Google Play Services, oferece serviços para determinar se um URL foi marcado como uma ameaça conhecida pelo Google.

Seu app pode usar essa API para determinar se um URL específico foi classificado pelo Google como ameaça conhecida. Internamente, a SafetyNet implementa um cliente para o protocolo de rede v4 da Navegação segura desenvolvido pelo Google. O código do cliente e o protocolo de rede v4 foram desenvolvidos para preservar a privacidade dos usuários e manter o consumo da bateria e da largura de banda em um nível mínimo. Use essa API para aproveitar ao máximo o serviço da Navegação segura do Google no Android da maneira mais otimizada possível para recursos e sem implementar o protocolo de rede.

A nova atualização da versão 5 (v5) apresenta melhorias significativas na atualização e privacidade de dados com o uso do HTTP Oblivious.

Este documento explica como usar a API SafetyNet Safe Browsing Lookup para verificar se há ameaças conhecidas em um URL.

Termos de Serviço

Ao usar a API Navegação segura, você aceita os Termos de Serviço. Leia e entenda todos os termos e políticas aplicáveis antes de acessar a API Navegação segura.

Solicitar e registrar uma chave de API do Android

Antes de usar a API Safe Browsing, crie e registre uma chave de API para Android. Para etapas específicas, consulte a página sobre como usar a Navegação segura.

Na v5, você fornece essa chave de API ao criar a instância SafeBrowsingClient.

Adicionar a dependência da API SafetyNet

Antes de usar a API Safe Browsing, adicione a API SafetyNet ao seu projeto. Se você estiver usando o Android Studio, adicione essa dependência ao arquivo do Gradle no nível do app. Para mais informações, consulte Proteger-se contra ameaças de segurança com a SafetyNet.

Inicializar a API

Para usar a API Safe Browsing, você precisa inicializar a API chamando initSafeBrowsing e esperar a conclusão do processo. O snippet de código abaixo mostra um exemplo:

Kotlin

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

Java

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

Na v5, o GmsCore oferece o cliente da Navegação segura. Você precisa receber uma instância SafeBrowsingClient. Simplificamos a superfície da API para aumentar a eficiência e reduzir o inchaço.

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

Solicitar uma verificação de URL

Use o método lookupUri para verificar se um URI representa uma ameaça. É necessário especificar o protocolo pretendido, que pode ser a lista de bloqueio local (v4) ou a proteção em tempo real (v5) .

Enviar a solicitação de verificação de URL

A API é independente do esquema usado, então você pode transmitir o URL com ou sem um esquema. Por exemplo, tanto

Kotlin

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

Java

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

quanto

Kotlin

var url = "www.google.com"

Java

String url = "www.google.com";

são válidos.

O código abaixo demonstra como enviar uma solicitação de verificação 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());
               }
           }
   });

A assinatura lookupUri atualizada usa o URI, uma lista de tipos de ameaça e o protocolo.

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!
        }
    }

Ler a resposta de verificação de URL

Usando o objeto SafetyNetApi.SafeBrowsingResponse retornado, chame o método getDetectedThreats, que retorna uma lista de objetos SafeBrowsingThreat. Se a lista retornada estiver vazia, isso significa que a API não detectou nenhuma ameaça conhecida. Se a lista não estiver vazia, chame getThreatType em cada elemento da lista para determinar quais ameaças conhecidas a API detectou.

Para conferir o texto de alerta sugerido, consulte o Guia da API Safe Browsing para desenvolvedores.

Especificar tipos de ameaças

As constantes da classe SafeBrowsingThreat contêm os tipos de ameaça atualmente com suporte:

Tipo de ameaça Definição
TYPE_POTENTIALLY_HARMFUL_APPLICATION Esse tipo de ameaça identifica URLs de páginas sinalizadas por terem aplicativos potencialmente nocivos.
TYPE_SOCIAL_ENGINEERING Esse tipo de ameaça identifica URLs de páginas sinalizadas como contendo ameaças de engenharia social.

Ao usar a API, você adiciona constantes de tipo de ameaça como argumentos. Você pode adicionar quantas constantes de tipo de ameaça o app exigir, mas só é possível usar constantes que não estejam marcadas como descontinuadas.

Desligar sua sessão de Navegação segura

Se o app não precisar usar a API Safe Browsing por um período prolongado, verifique todos os URLs necessários no app e encerre a sessão de Navegação segura usando o método shutdownSafeBrowsing:

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

Recomendamos que você chame shutdownSafeBrowsing no método onPause da atividade e que você chame initSafeBrowsing no método onResume da atividade. No entanto, verifique se initSafeBrowsing terminou a execução antes de chamar lookupUri Ao garantir que sua sessão esteja sempre atualizada, você reduz a possibilidade de erros internos no app.

Detalhes da proteção em tempo real

A atualização da v5 apresenta um modo de proteção em tempo real que evita problemas de dados desatualizados (que podem chegar a 20 a 50 minutos na v4). Ele muda de um protocolo permitir por padrão para um protocolo verificar por padrão , aprimorando a proteção contra ameaças de propagação rápida. No modo em tempo real, os clientes mantêm um banco de dados local e um cache global de sites provavelmente benignos para fornecer proteção quase em tempo real com os dados de ameaças mais recentes.

Tipos de ameaças com suporte

A API permite que você escolha que tipos de ameaça são importantes para suas necessidades. A API v5 oferece suporte a uma gama maior de tipos de ameaças:

Constante de tipo de ameaça Descrição
NO_THREAT Nenhuma ameaça.
TYPE_MALWARE Ameaças gerais de malware.
TYPE_UNWANTED_SOFTWARE Software ou aplicativos indesejados.
TYPE_POTENTIALLY_HARMFUL_APPLICATION Apps que podem prejudicar o dispositivo ou o usuário.
TYPE_SOCIAL_ENGINEERING Phishing e outros sites enganosos.
TYPE_TRICK_TO_BILL Páginas que enganam os usuários para ações de faturamento.
TYPE_BETTER_ADS_VIOLATION Sites que violam os Better Ads Standards.
TYPE_MALWARE_OFFLINE Malware off-line.
TYPE_ABUSIVE_EXPERIENCE_VIOLATION Violações que resultam em uma experiência ruim para o usuário.
TYPE_HIGH_CONFIDENCE_ALLOW_LIST Lista de permissões de alta confiança

Dados coletados pela API SafetyNet Navegação segura

A API SafetyNet Safe Browsing coleta os dados abaixo automaticamente quando se comunica com esse serviço no Android:

Dados Descrição
Atividade no app Coleta o prefixo de hash de URLs após uma correspondência desse tipo para fins de detecção de URLs maliciosos.

A API SafetyNet Navegação segura coleta o prefixo de hash de URLs para detectar URLs maliciosos. A versão 5 implementa o HTTP Oblivious para proteger ainda mais os dados do usuário durante essas pesquisas.

Nosso objetivo é oferecer o máximo de transparência possível, mas você é o único responsável por decidir como responder ao formulário da seção "Segurança dos dados" do Google Play com relação à coleta de dados, ao compartilhamento e às práticas de segurança dos dados do usuário do seu app.