API de actualización de Navegación segura (v4)

Descripción general

La API de Update permite que las aplicaciones cliente descarguen versiones con codificación hash de las listas de Navegación segura para en una base de datos local. Luego, es posible verificar las URLs de forma local. Solo si se encuentra una coincidencia en el base de datos local, si el cliente necesita enviar una solicitud a los servidores de Navegación segura para verificarla si la URL se incluye en las listas de Navegación segura.

Antes de usar la API de Update, debes configurar una base de datos local. La Navegación segura proporciona un paquete de Go que puedes usar para comenzar. Para obtener más detalles, consulta la sección Configuración de bases de datos en Bases de datos locales.

Actualiza la base de datos local

Para mantenerse actualizados, los clientes deben actualizar las listas de Navegación segura en sus bases de datos locales de forma periódica. Para ahorrar ancho de banda, los clientes descargan los prefijos hash de las URLs en lugar del URLs sin procesar. Por ejemplo, si "www.urlmal.com/" está en una lista de Navegación segura, los clientes descargan el Hay un prefijo de hash SHA256 de esa URL en lugar de la URL en sí. En la mayoría de los casos, los prefijos de hash tienen 4 bytes de longitud, lo que significa que el costo promedio del ancho de banda para la descarga de una sola entrada de lista es de 4 bytes antes de la compresión.

Para actualizar las listas de Navegación segura en la base de datos local, envía una solicitud POST HTTP al threatListUpdates.fetch método:

  • La solicitud POST HTTP incluye los nombres de las listas que se actualizarán junto con varias restricciones del cliente para atenerse a las limitaciones de memoria y ancho de banda.
  • La respuesta HTTP POST muestra una actualización completa o una actualización parcial. La respuesta puede mostrar una duración de espera mínima.

Ejemplo: threatListUpdates.fetch

Solicitud HTTP POST

En el siguiente ejemplo, se solicitan las actualizaciones para una sola lista de Navegación segura.

Encabezado de la solicitud

El encabezado de la solicitud incluye la URL de la solicitud y el tipo de contenido. Recuerda sustituir tu clave de API por API_KEY en la URL.

POST https://safebrowsing.googleapis.com/v4/threatListUpdates:fetch?key=API_KEY HTTP/1.1
Content-Type: application/json

Cuerpo de la solicitud

El cuerpo de la solicitud incluye la información del cliente (ID y versión) y la información de actualización (el nombre de la lista, el estado de la lista y las restricciones del cliente). Para obtener más detalles, consulta el cuerpo de la solicitud threatListUpdates.fetch y las explicaciones que siguen al ejemplo de código.

{
  "client": {
    "clientId":       "yourcompanyname",
    "clientVersion":  "1.5.2"
  },
  "listUpdateRequests": [{
    "threatType":      "MALWARE",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "state":           "Gg4IBBADIgYQgBAiAQEoAQ==",
    "constraints": {
      "maxUpdateEntries":      2048,
      "maxDatabaseEntries":    4096,
      "region":                "US",
      "supportedCompressions": ["RAW"]
    }
  }]
}
Información del cliente

Los campos clientID y clientVersion deben identificar de manera inequívoca a una implementación cliente, no a una usuario individual. (La información del cliente se usa en el registro del lado del servidor. Puedes elegir cualquier nombre para el ID de cliente, pero te sugerimos que elijas uno que represente la verdadera identidad del cliente, como el nombre de su empresa, presentados todas en una sola palabra y en minúsculas).

Listas de Navegación segura

Los campos threatType, platformType y threatEntryType se combinan para identificar (nombre) las listas de Navegación segura. En el ejemplo, se identifica una lista: SOFTWARE MALICIOSO/WINDOWS/URL. Antes de enviar una solicitud, asegúrate de que las combinaciones de tipos que especifiques sean válidas (consulta las listas de Navegación segura).

Estado del cliente

El campo state contiene el estado actual del cliente de la lista de Navegación segura. (Los estados del cliente se muestran en el campo newClientState de la respuesta threatListUpdates.fetch). Para las actualizaciones iniciales, deja el campo state vacío.

Restricciones de tamaño

El campo maxUpdateEntries especifica el número total de actualizaciones que el cliente puede administrar (en el ejemplo 2048). El campo maxDatabaseEntries especifica la cantidad total de entradas que la base de datos local puede administrar (en el ejemplo, 4096). Los clientes deben establecer restricciones de tamaño para proteger las limitaciones de memoria y ancho de banda, así como de protección el crecimiento. Para obtener más información, (consulta Actualiza las restricciones).

Compresiones admitidas

En el campo supportedCompressions, se enumeran los tipos de compresión que admite el cliente. En el ejemplo, el cliente solo admite datos sin procesar y sin comprimir. Sin embargo, la Navegación segura admite tipos de compresión (consulta Compresión).

Respuesta HTTP POST

En este ejemplo, la respuesta devuelve una actualización parcial para la lista de Navegación segura con el parámetro tipo de compresión solicitada.

Encabezado de respuesta

El encabezado de respuesta incluye el código de estado HTTP y el tipo de contenido. Los clientes que reciben un código de estado distinto de HTTP/200 deben ingresar al modo de retirada. (consulta Frecuencia de las solicitudes).

HTTP/1.1 200 OK
Content-Type: application/json

Cuerpo de la respuesta

El cuerpo de la respuesta incluye la información de actualización (el nombre de la lista, el tipo de respuesta, adiciones y eliminaciones que se aplicarán a la base de datos local, el cliente nuevo estado y una suma de comprobación). En el ejemplo, la respuesta también incluye una duración de espera mínima. Para ver más detalles, consulta la cuerpo de respuesta dethreatListUpdates.fetch y las explicaciones que siguen al ejemplo del código.

{
  "listUpdateResponses": [{
    "threatType":      "MALWARE",
    "threatEntryType": "URL",
    "platformType":    "WINDOWS",
    "responseType" :   "PARTIAL_UPDATE",
    "additions": [{
      "compressionType": "RAW",
      "rawHashes": {
        "prefixSize": 4,
        "rawHashes":  "rnGLoQ=="
      }
    }],
    "removals": [{
      "compressionType": "RAW",
      "rawIndices": {
        "indices": [0, 2, 4]
      }
    }],
    "newClientState": "ChAIBRADGAEiAzAwMSiAEDABEAFGpqhd",
    "checksum": {
      "sha256": "YSgoRtsRlgHDqDA3LAhM1gegEpEzs1TjzU33vqsR8iM="
    }
  }],
  "minimumWaitDuration": "593.440s"
}
Actualizaciones de bases de datos

El campo responseType indicará una actualización parcial o completa. En el ejemplo, se muestra una actualización parcial, por lo que la respuesta incluye las adiciones y las eliminaciones. Puede haber varios conjuntos de adiciones, pero solo un conjunto de eliminaciones (consulta Actualizaciones de la base de datos).

Estado de cliente nuevo

El campo newClientState contiene el nuevo estado de cliente para la lista de Navegación segura recientemente actualizada. Los clientes deben guardar el nuevo estado del cliente para las solicitudes de actualización posteriores (el campo state en la solicitud threatListUpdates.fetch o el campo clientStates en la solicitud fullHashes.find).

Sumas de verificación

La suma de verificación permite que los clientes verifiquen que la base de datos local no haya sufrido ningún daño. Si el botón de suma de comprobación no coincide, el cliente debe borrar la base de datos y volver a emitir una actualización con una state. Sin embargo, los clientes en esta situación deben seguir los intervalos de tiempo para las actualizaciones. (consulta Frecuencia de las solicitudes).

Duraciones de espera mínimas

En el campo minimumWaitDuration, se indica que el cliente debe esperar 593.44 segundos (9.89 minutos) antes de enviar otra solicitud de actualización. Ten en cuenta que el período de espera puede o no incluirse en el (consulta Frecuencia de las solicitudes).

Verifica las URL

Para verificar si una URL se incluyó en una lista de Navegación segura, el cliente primero debe calcular el hash y el prefijo de hash de la URL (consulta URL y hashing). Luego, el cliente consulta la base de datos local para determinar si existe una coincidencia. Si el prefijo de hash no está presente en la base de datos local, se considera que la URL es segura (no se encuentra en las listas de Navegación segura).

Si el prefijo de hash está presente en la base de datos local (una colisión del prefijo de hash), el cliente debe enviar el prefijo de hash a los servidores de Navegación segura para que sea verificado. Los servidores mostrarán todos los hash SHA 256 de longitud completa que contengan el prefijo de hash proporcionado. Si uno de esos hashes de longitud completa coincide con el hash de longitud completa de la URL en cuestión, se considera que la URL no es segura. Si ninguno de los hashes completos coincide con el hash completo de la URL en cuestión, la URL se considera segura.

Google no aprende en ningún momento las URL que estás examinando. Google aprende el hash prefijos de las URLs, pero los prefijos hash no proporcionan mucha información sobre las URLs reales.

Para comprobar si una URL está en una lista de Navegación segura, envía una solicitud POST HTTP al fullHashes.find método:

  • La solicitud HTTP POST puede incluir hasta 500 entradas de amenazas.
  • En la solicitud HTTP POST, se incluyen los prefijos de hash de las URLs que se deben verificar. Los clientes son se recomienda agrupar varias entradas de amenazas en una sola solicitud para reducir el uso del ancho de banda.
  • La respuesta HTTP POST muestra los hash completos coincidentes junto con las duraciones de caché positivas y negativas. La respuesta también puede mostrar una duración mínima de espera.

Ejemplo: fullHashes.find

Solicitud HTTP POST

En el siguiente ejemplo, se envían los nombres de dos listas de Navegación segura y tres prefijos hash para que se comparen y verifiquen.

Encabezado de la solicitud

El encabezado de la solicitud incluye la URL de la solicitud y el tipo de contenido. Recuerda reemplazar tu clave de API para API_KEY en la URL.

POST https://safebrowsing.googleapis.com/v4/fullHashes:find?key=API_KEY HTTP/1.1
Content-Type: application/json

Cuerpo de la solicitud

En el cuerpo de la solicitud, se incluye la información del cliente (ID y versión), los estados del cliente y la información de amenazas (los nombres de las listas y los prefijos de hash). En el caso de las solicitudes JSON, los prefijos de hash deben enviarse en formato codificado en base64. Para obtener más detalles, consulta la Cuerpo de la solicitud de fullHashes.find y las explicaciones que siguen al ejemplo del código.

{
  "client": {
    "clientId":      "yourcompanyname",
    "clientVersion": "1.5.2"
  },
  "clientStates": [
    "ChAIARABGAEiAzAwMSiAEDABEAE=",
    "ChAIAhABGAEiAzAwMSiAEDABEOgH"
  ],
  "threatInfo": {
    "threatTypes":      ["MALWARE", "SOCIAL_ENGINEERING"],
    "platformTypes":    ["WINDOWS"],
    "threatEntryTypes": ["URL"],
    "threatEntries": [
      {"hash": "WwuJdQ=="},
      {"hash": "771MOg=="},
      {"hash": "5eOrwQ=="}
    ]
  }
}
Información del cliente

Los campos clientID y clientVersion deben identificar de forma única una implementación de cliente, no un usuario individual. (La información del cliente se usa en el registro del servidor. Puedes elegir cualquier nombre para el ID de cliente, pero te sugerimos que elijas un nombre que represente la verdadera identidad del cliente, como el nombre de tu empresa, presentado en una sola palabra y en minúsculas).

Todos los estados del cliente

El campo clientStates contiene los estados de cliente de todas las listas de Navegación segura en la base de datos local del cliente. (Los estados del cliente se muestran en el campo newClientState de la respuesta threatListUpdates.fetch).

Listas de Navegación segura

Los campos threatTypes, platformTypes y threatEntryTypes se combinan para identificar (nombre) las listas de Navegación segura. En el ejemplo, se identifican dos listas: MALWARE/WINDOWS/URL y SOCIAL_ENGINEERING/WINDOWS/URL. Antes de enviar una solicitud, asegúrate de que las combinaciones de tipos que que especificas son válidos (consulta Listas de Navegación segura).

Prefijos hash de amenazas

La matriz de las entradas de amenazas contiene los prefijos hash de las URL que quieres comprobar. El campo hash debe contener el prefijo de hash exacto que se encuentra en la base de datos local. Por ejemplo, si el prefijo de hash local tiene 4 bytes de longitud, la entrada de amenaza debe tener 4 bytes de longitud. Si el botón el prefijo de hash local se alargó a 7 bytes y, luego, la entrada de la amenaza debe tener 7 bytes de largo.

En el ejemplo, la solicitud incluye tres prefijos de hash. Los tres prefijos se compararán con cada una de las listas de Navegación segura para determinar si hay un hash de longitud completa que coincida.

Nota: La API de Update y el método fullHashes.find siempre deben usar el campo hash, nunca el campo URL (consulta ThreatEntry).

Respuesta HTTP POST

En el siguiente ejemplo, la respuesta devuelve los datos coincidentes, organizados por lista de Navegación segura. junto con las duraciones de caché y espera.

Encabezado de respuesta

El encabezado de respuesta incluye el código de estado HTTP y el tipo de contenido. Los clientes que reciben un código de estado distinto de HTTP/200 deben retirarse (consulta Frecuencia de solicitudes).

HTTP/1.1 200 OK
Content-Type: application/json

Cuerpo de la respuesta

El cuerpo de la respuesta incluye la información de coincidencia (los nombres de las listas y los hashes completos, los metadatos, si están disponibles, y las duraciones de la caché). En el ejemplo, el cuerpo de la respuesta también incluye un la duración mínima de espera. Para obtener más detalles, consulta la Cuerpo de la respuesta de fullHashes.find y las explicaciones que siguen al ejemplo del código.

{
  "matches": [{
    "threatType":      "MALWARE",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "threat": {
      "hash": "WwuJdQx48jP-4lxr4y2Sj82AWoxUVcIRDSk1PC9Rf-4="
    },
    "threatEntryMetadata": {
      "entries": [{
        "key": "bWFsd2FyZV90aHJlYXRfdHlwZQ==",  // base64-encoded "malware_threat_type"
        "value": "TEFORElORw=="  // base64-encoded "LANDING"
       }]
    },
    "cacheDuration": "300.000s"
  }, {
    "threatType":      "SOCIAL_ENGINEERING",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "threat": {
      "hash": "771MOrRPMn6xPKlCrXx_CrR-wmCk0LgFFoSgGy7zUiA="
    },
    "threatEntryMetadata": {
      "entries": []
    },
    "cacheDuration": "300.000s"
  }],
  "minimumWaitDuration": "300.000s",
  "negativeCacheDuration": "300.000s"
}
Combinaciones

El objeto Matches muestra un hash coincidente de longitud completa para dos de los prefijos de hash. Las URLs correspondientes a estos hashes se consideran poco seguros. No se encontró ninguna coincidencia para el tercer prefijo hash, por lo que no se muestra nada; la URL correspondiente a este prefijo hash se considera segura.

Ten en cuenta que este ejemplo hace coincidir un hash de longitud completa con un prefijo de hash. sin embargo, podría haber en varios hashes completos que se asignan al mismo prefijo de hash.

Metadatos

El campo threatEntryMetadata es opcional y proporciona información adicional sobre la coincidencia de amenazas. Actualmente, los metadatos están disponibles para la lista de Navegación segura de MALWARE/WINDOWS/URL (consulta Metadatos).

Duraciones de la caché

Los campos cacheDuration y negativeCacheDuration indican la cantidad. de tiempo los hashes se deben se consideran inseguros o seguros (consulta Almacenamiento en caché).

Duraciones de espera mínimas

El campo minimumWaitDuration indica que el cliente debe esperar 300 segundos (5 minutos) antes enviando otra solicitud fullHashes. Ten en cuenta que se puede incluir o no un período de espera en la respuesta. (consulta Frecuencia de las solicitudes).