URLs and Hashing

Esta sección contiene especificaciones detalladas de cómo los clientes verifican las URLs.

Canonicalización de URLs

Antes de que se verifiquen las URLs, se espera que el cliente realice alguna canonicalización en esa URL.

Para empezar, suponemos que el cliente analizó la URL y la hizo válida de acuerdo con RFC 2396. Si la URL usa un nombre de dominio internacionalizado (IDN), el cliente debe convertirla a la representación ASCII Punycode. La URL debe incluir un componente de ruta de acceso, es decir, debe tener al menos una barra diagonal después del dominio (http://google.com/ en lugar de http://google.com).

Primero, quita los caracteres de tabulación (0x09), CR (0x0d) y LF (0x0a) de la URL. No quites las secuencias de escape para estos caracteres (p.ej., %0a).

En segundo lugar, si la URL termina en un fragmento, quítalo. Por ejemplo, acorta http://google.com/#frag a http://google.com/.

En tercer lugar, quita los escapes del porcentaje de la URL hasta que no tenga más caracteres en los escapes. (Esto puede hacer que la URL no sea válida).

Para canonizar el nombre de host, haz lo siguiente:

Extrae el nombre de host de la URL y luego haz lo siguiente:

  1. Quita todos los puntos iniciales y finales.
  2. Reemplaza los puntos consecutivos por un solo punto.
  3. Si el nombre de host se puede analizar como una dirección IPv4, normalízalo a 4 valores decimales separados por puntos. El cliente debe controlar cualquier codificación legal de direcciones IP, incluidos los números octal y hexadecimal, y menos de cuatro componentes.
  4. Si el nombre de host se puede analizar como una dirección IPv6 entre corchetes, normalízalo quitando los ceros iniciales innecesarios de los componentes y contrayendo los componentes cero con la sintaxis de dos dos puntos. Por ejemplo, [2001:0db8:0000::1] debe transformarse en [2001:db8::1]. Si el nombre de host es uno de los siguientes dos tipos de direcciones IPv6 especiales, transfórmalo a IPv4:
    • Una dirección IPv6 asignada a IPv4, como [::ffff:1.2.3.4], que debe transformarse en 1.2.3.4
    • Una dirección NAT64 que usa el prefijo conocido 64:ff9b::/96, como [64:ff9b::1.2.3.4], que se debe transformar en 1.2.3.4.
  5. Pon en minúscula toda la string.

Para canonicalizar la ruta de acceso, haz lo siguiente:

  1. Para resolver las secuencias /../ y /./ en la ruta de acceso, reemplaza /./ por / y quita /../ junto con el componente de ruta de acceso anterior.
  2. Reemplaza las ejecuciones de barras consecutivas por un solo carácter de barra.

No apliques estas canonicalizaciones de ruta a los parámetros de búsqueda.

En la URL, usa el carácter de escape de porcentaje para todos los caracteres que son <= ASCII 32, >= 127, # o %. Se deben usar caracteres hexadecimales en mayúsculas en los escapes.

Expresiones de prefijo de ruta de acceso con sufijo de host

Una vez que se canoniza la URL, el siguiente paso es crear las expresiones de sufijo o prefijo. Cada expresión de sufijo o prefijo consta de un sufijo de host (o host completo) y un prefijo de ruta de acceso (o ruta de acceso completa).

El cliente formará hasta 30 combinaciones diferentes de sufijo de host y prefijo de ruta de acceso. Estas combinaciones solo usan los componentes de host y ruta de acceso de la URL. Se descartan el esquema, el nombre de usuario, la contraseña y el puerto. Si la URL incluye parámetros de consulta, al menos una combinación incluirá la ruta completa y los parámetros de consulta.

Para el host, el cliente intentará como máximo con cinco strings diferentes. Son los siguientes:

  • Si el nombre de host no es un literal IPv4 o IPv6, se pueden formar hasta cuatro nombres de host que comienzan con el dominio eTLD+1 y agregan componentes iniciales sucesivos. La determinación del eTLD+1 debe basarse en la lista de sufijos públicos. Por ejemplo, a.b.example.com generaría el dominio eTLD+1 de example.com, así como el host con un componente de host adicional b.example.com.
  • Es el nombre de host exacto en la URL. Siguiendo el ejemplo anterior, se verificaría a.b.example.com.

Para la ruta, el cliente intentará como máximo con seis strings diferentes. Son:

  • La ruta exacta de la URL, incluidos los parámetros de búsqueda.
  • La ruta exacta de la URL, sin parámetros de búsqueda.
  • Las cuatro rutas que se forman a partir de la raíz (/) y que se agregan sucesivamente componentes de ruta, incluida una barra final.

En los siguientes ejemplos, se ilustra el comportamiento de la verificación:

Para la URL http://a.b.com/1/2.html?param=1, el cliente probará estas posibles strings:

a.b.com/1/2.html?param=1
a.b.com/1/2.html
a.b.com/
a.b.com/1/
b.com/1/2.html?param=1
b.com/1/2.html
b.com/
b.com/1/

Para la URL http://a.b.c.d.e.f.com/1.html, el cliente probará estas posibles strings:

a.b.c.d.e.f.com/1.html
a.b.c.d.e.f.com/
c.d.e.f.com/1.html
c.d.e.f.com/
d.e.f.com/1.html
d.e.f.com/
e.f.com/1.html
e.f.com/
f.com/1.html
f.com/

(Nota: Omite b.c.d.e.f.com, ya que solo tomaremos los últimos cinco componentes del nombre de host y el nombre de host completo).

Para la URL http://1.2.3.4/1/, el cliente probará estas posibles strings:

1.2.3.4/1/
1.2.3.4/

Para la URL http://example.co.uk/1, el cliente probará estas posibles strings:

example.co.uk/1
example.co.uk/

Hashing

La Navegación segura de Google usa exclusivamente SHA256 como función hash. Esta función hash se debe aplicar a las expresiones anteriores.

El hash completo de 32 bytes, según las circunstancias, se truncará a 4 bytes, 8 bytes o 16 bytes:

  • Cuando se usa el método hashes.search, actualmente se requiere que los valores hash de la solicitud se truncen a exactamente 4 bytes. El envío de bytes adicionales en esta solicitud comprometerá la privacidad del usuario.

  • Cuando descargas las listas de la base de datos local con el método hashList.get o el método hashLists.batchGet, la longitud de los hash que envía el servidor se codifica dentro de la convención de nombres de las listas que contienen un sufijo que indica la longitud del hash. Consulta la sección Listas disponibles para obtener más información.