URLs and Hashing

Cette section contient des spécifications détaillées sur la façon dont les clients vérifient les URL.

Choix de l'URL canonique

Avant que des URL ne soient vérifiées, le client doit effectuer une canonique de l'URL.

Pour commencer, nous supposons que le client a analysé l'URL et l'a validée conformément à la norme RFC 2396. Si l'URL utilise un nom de domaine internationalisé (IDN), le client doit convertir l'URL en une syntaxe Punycode ASCII. L'URL doit inclure un composant de chemin, c'est-à-dire qu'elle doit comporter au moins une barre oblique après le domaine (http://google.com/ au lieu de http://google.com).

Tout d'abord, supprimez les caractères de tabulation (0x09), CR (0x0d) et LF (0x0a) de l'URL. Ne supprimez pas les séquences d'échappement de ces caractères (par exemple, %0a).

Ensuite, si l'URL se termine par un fragment, supprimez-le. Par exemple, raccourcissez http://google.com/#frag en http://google.com/.

Enfin, supprimez les échappements de pourcentage de l'URL jusqu'à ce qu'il n'y en ait plus. (ce qui peut rendre l'URL non valide).

Pour mettre en forme canonique le nom d'hôte:

Extrayez le nom d'hôte de l'URL, puis procédez comme suit :

  1. Supprimez tous les points au début et à la fin.
  2. Remplacez les points consécutifs par un seul point.
  3. Si le nom d'hôte peut être analysé en tant qu'adresse IPv4, normalisez-le en y indiquant 4 valeurs décimales séparées par des points. Le client doit gérer tout encodage d'adresse IP légitime, y compris les valeurs octales, hexadécimales et moins de quatre composants.
  4. Si le nom d'hôte peut être analysé en tant qu'adresse IPv6 entre crochets, normalisez-le en supprimant les zéros inutiles au début des composants et en réduisant les composants à zéro à l'aide de la syntaxe à double deux-points. Par exemple, [2001:0db8:0000::1] doit être transformé en [2001:db8::1]. Si le nom d'hôte correspond à l'un des deux types d'adresses IPv6 spéciaux suivants, transformez-le en IPv4 :
    • Une adresse IPv6 mappée sur IPv4, telle que [::ffff:1.2.3.4], qui doit être transformée en 1.2.3.4 ;
    • Une adresse NAT64 utilisant le préfixe bien connu 64:ff9b::/96, comme [64:ff9b::1.2.3.4], qui doit être transformée en 1.2.3.4.
  5. Mettre la chaîne en minuscules.

Pour mettre en forme canonique le chemin:

  1. Corrigez les séquences /../ et /./ du chemin en remplaçant /./ par / et en supprimant /../ avec le composant de chemin précédent.
  2. Remplacez les séries de barres obliques consécutives par une seule barre oblique.

N'appliquez pas ces méthodes de mise en forme canonique du chemin aux paramètres de requête.

Dans l'URL, appliquez des échappements de pourcentage à tous les caractères qui sont : <= ASCII 32, >= 127, # ou %. Les échappements doivent utiliser des caractères hexadécimaux en majuscules.

Expressions de suffixe d'hôte et de préfixe de chemin

Une fois l'URL mise en forme canonique, l'étape suivante consiste à créer les expressions de suffixe/préfixe. Chaque expression de suffixe/préfixe se compose d'un suffixe d'hôte (ou hôte complet) et d'un préfixe de chemin (ou chemin d'accès complet).

Le client formera jusqu'à 30 combinaisons possibles de suffixe d'hôte et de préfixe de chemin. Ces combinaisons n'utilisent que les composants d'hôte et de chemin de l'URL. Le schéma, le nom d'utilisateur, le mot de passe et le port sont supprimés. Si l'URL inclut des paramètres de requête, au moins une combinaison inclut le chemin complet et les paramètres de requête.

Pour l'hôte, le client essaie au maximum cinq chaînes différentes. Les voici :

  • Si le nom d'hôte n'est pas un littéral IPv4 ou IPv6, jusqu'à quatre noms d'hôte peuvent être créés en commençant par le domaine eTLD+1 et en ajoutant des composants au début. La détermination de l'eTLD+1 doit être basée sur la liste des suffixes publics. Par exemple, a.b.example.com générerait le domaine eTLD+1 de example.com ainsi que l'hôte avec un composant d'hôte supplémentaire b.example.com.
  • Le nom d'hôte exact dans l'URL. Dans l'exemple précédent, a.b.example.com serait vérifié.

Pour le chemin, le client essaie au maximum six chaînes différentes. À savoir :

  • Le chemin d'accès exact de l'URL, y compris les paramètres de requête.
  • Le chemin d'accès exact de l'URL, sans paramètres de requête.
  • Les quatre chemins créés en partant de la racine (/) et en ajoutant successivement les composants de chemin, y compris une barre oblique finale.

Les exemples suivants illustrent le comportement de la vérification :

Pour l'URL http://a.b.com/1/2.html?param=1, le client essaie les chaînes possibles suivantes :

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/

Pour l'URL http://a.b.c.d.e.f.com/1.html, le client essaie les chaînes possibles suivantes :

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/

(Remarque: ignorez b.c.d.e.f.com, car nous ne prendrons que les cinq derniers composants du nom d'hôte et le nom d'hôte complet.)

Pour l'URL http://1.2.3.4/1/, le client essaie les chaînes possibles suivantes :

1.2.3.4/1/
1.2.3.4/

Pour l'URL http://example.co.uk/1, le client essaie les chaînes possibles suivantes :

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

Hachage

La navigation sécurisée Google utilise exclusivement SHA256 comme fonction de hachage. Cette fonction de hachage doit être appliquée aux expressions ci-dessus.

Le hachage complet de 32 octets sera tronqué en 4 octets, 8 octets ou 16 octets, selon les circonstances:

  • Lorsque vous utilisez la méthode hashes.search, nous exigeons actuellement que les hachages de la requête soient tronqués à exactement quatre octets. L'envoi d'octets supplémentaires dans cette requête compromet la confidentialité des utilisateurs.

  • Lorsque vous téléchargez les listes pour la base de données locale à l'aide de la méthode hashList.get ou de la méthode hashLists.batchGet, la longueur des hachages envoyés par le serveur est encodée dans la convention d'attribution de noms des listes contenant un suffixe indiquant la longueur du hachage. Pour en savoir plus, consultez la section Listes disponibles.