Crear hashes de URLs

Información general

Las listas de Web Risk están formadas por hashes SHA256 de longitud variable. Para obtener más información, consulta List Contents (Contenido de la lista). Para comprobar si una URL está en una lista de Web Risk, ya sea localmente o en el servidor, los clientes deben calcular primero el prefijo de hash de esa URL.

Para calcular el prefijo hash de una URL, sigue estos pasos:

  1. Canonicaliza la URL tal como se describe en Canonicalización.
  2. Crea las expresiones de sufijo o prefijo de la URL tal como se describe en Expresiones de sufijo o prefijo.
  3. Calcula el hash completo de cada expresión de sufijo o prefijo, tal como se describe en Cálculos de hash.
  4. Calcula el prefijo de hash de cada hash de longitud completa, tal como se describe en Cálculos de prefijos de hash.

Ten en cuenta que estos pasos reflejan el proceso que usa el servidor de Web Risk para mantener las listas de Web Risk.

Canonicalización

Para empezar, asumimos que el cliente ha analizado la URL y la ha validado 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, es decir, debe tener una barra diagonal inicial (http://google.com/).

Primero, elimina los caracteres de tabulación (0x09), retorno de carro (0x0d) y salto de línea (0x0a) de la URL. No elimines las secuencias de escape de estos caracteres, como %0a.

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

En tercer lugar, elimina repetidamente los caracteres de escape de porcentaje de la URL hasta que no haya más.

Para canonicalizar el nombre de host

Extrae el nombre de host de la URL y, a continuación, haz lo siguiente:

  1. Elimina todos los puntos iniciales y finales.
  2. Sustituye los puntos consecutivos por un solo punto.
  3. Si el nombre de host se puede analizar como una dirección IP, normalízalo a 4 valores decimales separados por puntos. El cliente debe gestionar cualquier codificación de direcciones IP válida, incluidos los formatos octal y hexadecimal, así como las direcciones con menos de cuatro componentes.
  4. Poner toda la cadena en minúsculas.

Para canonicalizar la ruta

  1. Resuelve las secuencias /../ y /./ de la ruta sustituyendo /./ por / y eliminando /../ junto con el componente de ruta anterior.
  2. Sustituye las secuencias de barras consecutivas por un solo carácter de barra.

No aplique estas canonicalizaciones de ruta a los parámetros de consulta.

En la URL, aplica el carácter de escape de porcentaje a todos los caracteres que sean <= ASCII 32, >= 127, # o %. Los caracteres de escape deben ser hexadecimales y estar en mayúsculas.

A continuación, se indican algunas pruebas que pueden ayudarte a validar una implementación de la canonización.

Canonicalize("http://host/%25%32%35") = "http://host/%25";
Canonicalize("http://host/%25%32%35%25%32%35") = "http://host/%25%25";
Canonicalize("http://host/%2525252525252525") = "http://host/%25";
Canonicalize("http://host/asdf%25%32%35asd") = "http://host/asdf%25asd";
Canonicalize("http://host/%%%25%32%35asd%%") = "http://host/%25%25%25asd%25%25";
Canonicalize("http://www.google.com/") = "http://www.google.com/";
Canonicalize("http://%31%36%38%2e%31%38%38%2e%39%39%2e%32%36/%2E%73%65%63%75%72%65/%77%77%77%2E%65%62%61%79%2E%63%6F%6D/") = "http://168.188.99.26/.secure/www.ebay.com/";
Canonicalize("http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/") = "http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/";
Canonicalize("http://host%23.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A22%252833%252944_55%252B") = "http://host%23.com/~a!b@c%23d$e%25f^00&11*22(33)44_55+";
Canonicalize("http://3279880203/blah") = "http://195.127.0.11/blah";
Canonicalize("http://www.google.com/blah/..") = "http://www.google.com/";
Canonicalize("www.google.com/") = "http://www.google.com/";
Canonicalize("www.google.com") = "http://www.google.com/";
Canonicalize("http://www.evil.com/blah#frag") = "http://www.evil.com/blah";
Canonicalize("http://www.GOOgle.com/") = "http://www.google.com/";
Canonicalize("http://www.google.com.../") = "http://www.google.com/";
Canonicalize("http://www.google.com/foo\tbar\rbaz\n2") ="http://www.google.com/foobarbaz2";
Canonicalize("http://www.google.com/q?") = "http://www.google.com/q?";
Canonicalize("http://www.google.com/q?r?") = "http://www.google.com/q?r?";
Canonicalize("http://www.google.com/q?r?s")