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.