Envisager:
Quand je mets un point après l'URL super-utilisateur, https://superuser.com.
, il a agi comme je n'étais pas connecté. Pourquoi cela se produit-il? Qu'est-ce qu'un point symbolise dans l'URL?
L'ajout du point à la fin du nom de domaine en fait un nom de domaine absolu entièrement qualifié au lieu d'un nom de domaine entièrement qualifié ordinaire, et la plupart des navigateurs traitent des noms de domaine absolus comme étant un domaine différent du nom de domaine régulier équivalent (i 'M Pas sûr pourquoi Ils le font cependant).
Le système de nom de domaine est strictement hiérarchique, tout comme un système de fichiers, ou un répertoire X.500/LDAP. Contrairement aux systèmes de fichiers ou x.500, la hiérarchie est répertorie à droite à gauche au lieu de gauche à droite. Donc, le composant le plus à droite d'un nom de domaine est le haut de la hiérarchie. Mettre un point à l'extrême droite d'un nom de domaine le rend absolu, ce qui signifie qu'il est explicitement enraciné en haut de la hiérarchie DNS. En substance, c'est la même chose que d'utiliser un nom distinctif complet au lieu d'un nom commun dans une recherche X.500 ou de mettre un /
Au début d'un chemin Posix.
L'utilisation d'un FQDN absolu a quelques conséquences spécifiques pour la manière dont un système client recherchera l'enregistrement DNS pour ce domaine:
/etc/hosts
sur un système de type UNIX)..local
Domaine, il obligera certains systèmes à utiliser des MDN au lieu de DNS traditionnels pour essayer de résoudre le nom.Cette dernière partie est la partie importante et est la raison pour laquelle le concept d'une FQDN absolue existe. La plupart des systèmes peuvent être configurés avec ce qu'on appelle un domaine de recherche. Lorsqu'ils vont résoudre un domaine donné, ils essaieront d'abord de regarder par des domaines de recherche configurés et ne résolvent que du haut de la hiérarchie s'ils ne trouvent pas le nom dans des domaines de recherche configurés (donc, si vous avez eu foo.example
Configuré comme domaine de recherche sur votre système et essayé d'aller à bar.example
Dans un navigateur, il faudrait (normalement, voir ci-dessous) essayer d'aller à bar.example.foo.example
Premier, et seulement s'il n'a pas pu trouver que cela essaierait-il bar.example
directement). La plupart des résolveurs, mais pas tous, ces jours-ci ignorent le domaine de recherche lors de la résolution d'un domaine qui se termine par un nom de domaine de niveau supérieur connu (.com
, .net
, etc.), il n'est donc pas nécessaire que la plupart des utilisateurs utilisent des FQDN absolus et que la plupart des gens ne savent donc pas à leur sujet.
Ceci est parce que example.com
Et example.com.
Sont (parfois!) Considéré comme des hôtes différents, pour deux raisons:
Si le navigateur les considère comme des hôtes différents, il ne partagera pas l'état de la session (par exemple les cookies) entre eux, donc un "hôte" ne saurait pas que l'autre vous a connecté.
Une partie de ceci est que le navigateur peut ne pas savoir, en fonction de sa mise en œuvre, que les deux résolvent réellement au même nom. Surtout s'il a passé la résolution DNS sur un résolveur distant et n'attend que d'une adresse IP (plutôt que de l'enregistrement complet).
Comme AUSTIN notait, les différentes significations ont noté une conséquence de la manière dont les recherches du DNS fonctionnent avec la recherche suffit. Votre étiquette typique non enracinée, par ex. example.com
, Vous fera d'abord que votre résolveur Type DNS Essayez de rechercher tous les suffisants définis sur votre système. Dans un environnement d'entreprise, cela peut être votre domaine de compagnie, par exemple. Si vous avez mycompany.example.
défini comme un suffixe de recherche, une recherche pour example.com
sera d'abord essayer example.com.mycompany.example.
. Ceci est utile si vous vouliez rechercher un serveur interne sans avoir à taper le domaine complet totalisé ("complet").
Mais que si vous vouliez réellement le public example.com
? Vous pouvez utiliser le trailing .
, Dans le formulaire example.com.
, Afin de dire au résolveur que vous avez entré un nom absolu ("complet") et de ne pas essayer de rechercher les suffisants de recherche .
Il y a quelques endroits où nous devons rechercher comment ceux-ci sont normalisés et malheureusement, les eaux peuvent être un peu boueuses. J'aime généralement chercher la norme la plus pertinente d'abord et revenir à partir de là, mais comme cela est tellement dispersé, il peut être plus facile de commencer par le bas.
Internet Standard RFC1034 décrit les noms de domaine dans Section 3.1 et spécifie la "syntaxe de nom préférée" pour les noms de domaine dans Section 3.5 . NOTE À LA SECTION 3.1:
Chaque nœud a une étiquette de zéro à 63 octets de longueur. Les nœuds frères peuvent ne pas avoir la même étiquette, bien que la même étiquette puisse être utilisée pour les nœuds qui ne sont pas des frères. Une étiquette est réservée et c'est la marque NULL (I.e. Longueur zéro) utilisée pour la racine.
[...]
Lorsqu'un utilisateur doit taper un nom de domaine, la longueur de chaque étiquette est omise et les étiquettes sont séparées par des points ("."). Étant donné qu'un nom de domaine complet se termine par l'étiquette racine, cela conduit à une forme imprimée qui se termine par un point. Nous utilisons cette propriété pour distinguer entre:
une chaîne de caractères qui représente un nom de domaine complet (souvent appelé "absolu"). Par exemple, "poneria.isi.edu".
une chaîne de caractères qui représente les étiquettes de départ d'un nom de domaine incomplète et doit être complétée par un logiciel local à l'aide de connaissances du domaine local (souvent appelé "relatif"). Par exemple, "Poneria" utilisée dans le domaine ISI.EDU.
Les noms relatifs sont pris par rapport à une origine bien connue ou à une liste de domaines utilisés comme liste de recherche. Les noms de relatifs apparaissent principalement à l'interface utilisateur, où leur interprétation varie de la mise en œuvre à la mise en œuvre et dans les fichiers principaux, où ils sont relatifs à un seul nom de domaine d'origine. L'interprétation la plus courante utilise la racine "." Comme l'origine unique ou comme l'un des membres de la liste de recherche, un nom de relative multi-étiquettes est donc souvent celui où le point de fuite a été omis de sauver la dactylographie.
De là, nous pouvons aller à la manière dont les noms de domaine sont utilisés dans URIS, Internet Standard RFC3986 . In Section 3 Nous voyons la syntaxe URI. La pièce que nous sommes intéressée est l'autorité , qui contient un hôte (suivi d'un port optionnel :
). Ceci est en outre défini dans section 3.2.2 , spécifiquement la partie qui parle d'un nom enregistré :
Un nom déposé destiné à la recherche dans le DNS utilise la syntaxe définie dans la section 3.5 de [RFC1034] et la section 2.1 de [RFC1123]. Un tel nom consiste en une séquence d'étiquettes de domaine séparées par ".", Chaque étiquette de domaine démarrant et se terminant par un caractère alphanumérique et contenant également des caractères "-". L'étiquette de domaine le plus à droite d'un nom de domaine entièrement qualifié dans DNS peut être suivie d'un seul ".". et devrait être s'il est nécessaire de distinguer le nom de domaine complet et du domaine local.
Cela nous ramène aux suffisants de recherche et la possibilité d'un "domaine local" correspondant à un résultat différent du "domaine complet". N'oubliez pas que conceptuellement, selon RFC1034, example.com.
Est équivalent à example.com.<root>
, Où <root>
Est l'étiquette spéciale null.
Il y a une discussion sur la normalisation dans Section 6 Mais rien sur l'hôte, encore moins de traîner les points.
Standard proposé RFC 7230 , qui définit http/1.1, note qu'il suit en grande partie RFC3986 pour les définitions URI de section 2.7 .
C'est là que les choses sont déroutantes.
Informationnelle RFC2818 décrit HTTP sur TLS (HTTPS). Cela ne dit rien d'explicite sur la correspondance de l'hôte, à part après les règles de RFC2459 (remplacées par la norme proposée RFC5280 ). Ceci fait référence à RFC1034 (celui qui a défini DNS), mais ne dit rien d'explicite sur les adresses absolues ni les points de fuite.
Standard proposé RFC6125 est une tâche plus moderne sur les utilisations de TLS. Il parle davantage de la correspondance des noms de domaine, mais ne résout pas explicitement des points de fuite - cependant, il dit que vous êtes censé correspondre à "les noms de domaine totalement qualifiés" uniquement (il s'agit d'un concept étonnamment mal défini). Il dise que tous les étiquettes doivent correspondre - qui remonte à la RFC1034, et si nous considérons que l'étiquette NULL doit représenter la racine, alors example.com
Et example.com.
Faites différentes étiquettes (ce dernier a 3, example
, com
et <root>
).
Il y a une discussion sur Mozilla Bug 134402 sur les différentes interprétations.
S'éloigner un peu TLS, nous pouvons regarder des cookies dans la norme proposée RFC6265 . Là, Section 5.1.2 et Section 5.1.3 parler de canonicalisation et de correspondance des noms d'hôtes. Ici, encore une fois, nous avons divisé le nom de l'hôte en étiquettes individuelles pour effectuer la canonique (qui convertit essentiellement les noms de domaine Unicode en ascii/punycode minuscule). Et, à nouveau chargée de savoir si vous considérez que l'étiquette nulle représentant la racine a été préservée à travers cette étape de canonicalisation. Si vous le faites, ils ont des étiquettes différentes et sont donc différents hôtes aux fins des cookies.
L'explication donnée par Mokubai est exactement correcte et le problème est dans le navigateur qui n'a pas identifié qu'il s'agit du même domaine et donc de ne pas envoyer les cookies.
Mais la situation est encore pire: le point à l'extrémité ne marque que le domaine comme entièrement qualifié (sans ambiguïté), qui fonctionne assez bien avec DNS, car le message atteint enfin la bonne adresse (superuser.com
).
J'ai même eu de Fiddler cette boîte de dialogue pour superuser.com.
(avec point):
Avec des tests empiriques, voici les en-têtes envoyés avec ces deux demandes.
https://superuser.com
(informations sensibles croisées)
https://superuser.com.
(avec point, aucune information sensible n'a besoin d'être franchie)
Conclusion : Le problème est avec le navigateur qui n'ignore pas un point à la fin d'un nom de domaine complet qualifié, comme c'est tout à fait possible par la norme DNS.
Remarque: les développeurs de navigateurs n'étaient pas le seul à tomber dans ce piège. J'ai l'add-on noscript installé pour arrêter tout JavaScript, mais superuser.com
(aucun point) n'est autorisé à travers. Mais Noscript bloque toujours superuser.com.
(avec point) comme étant un site Web inconnu. Je ne doute pas que les tests trouveraient le même comportement dans de nombreux autres produits.
Il est étrange que les développeurs des principaux acteurs du domaine Web, tels que Google Chrome, Firefox et Microsoft's Fiddler, tous responsables de nombreuses avancées sur les normes Web, n'ont pas accordé attention à cette possibilité.