Que se passe-t-il lorsque je survole un lien dans Chrome?

40

Lorsque vous cliquez sur ce lien ( http://a//%%30%30) dans Google Chrome, celui-ci rompt et ferme tous les onglets et toutes les instances.

Mais, dans certains cas, il suffit de survoler le lien et l’onglet se bloque.

Que se passe-t-il lorsque je survole ce lien? Je veux dire, que fait Chrome lorsqu'un lien est survolé?

LINQ
la source
12
Voici une superbe vidéo de Tom Scott qui parle de ce qu'il pense se passe en chrome youtube.com/watch?v=0fw5Cyh21TE
DLeh le
5
Ce problème a été corrigé dans Chrome 45.0.2454.101 . Il était toujours présent dans Chrome 45.0.2454.99 .
Deltik
Le bogue n'est pas corrigé dans Chrome 45.0.2454.101 (du moins sur Mac OS 10.10.5, Chrome plante toujours).
math

Réponses:

42

L'accident est dû à un bug récemment découvert dans Chrome - et d' autres navigateurs WebKit * - spécifiquement liés soit (!) %%30%30, %0%30Ou %%300dans le cadre de l'URL, qui en interne tous finissent représentant le même symbole: nulle . Vous pouvez en savoir plus sur le bogue ici .

Ce n'est pas un bug qui affecte la plupart des liens, vous n'avez donc généralement pas à vous soucier de survoler les liens.

Remarques:
* Les autres navigateurs WebKit incluent Safari, Opera, Navigateur Steam, Midori, S60 (Symbian), Blackberry Browser et le navigateur de Playstation 3 - mais pas Firefox, Internet Explorer ou Edge.

Edit: Ce bogue a été corrigé dans Chrome 45.0.2454.101, comme le fait remarquer Deltik .

Plus sur ce qui se passe

Le problème est lié au canoniseur d'URL , qui s'exécute dès que vous survolez un lien - éventuellement pour afficher le lien dans la barre d'état du navigateur et pour effectuer une pré - extraction de la page Web afin qu'elle soit plus rapide une fois cliquée.

En ce qui concerne le rôle du canoniseur d'URL:
quand une URL est écrite HTML, elle peut être écrite sous une forme telle que /homeou ../../home, mais les navigateurs doivent la traduire en quelque chose avec un protocole et un domaine, comme http://superuser.com/home. De plus, l'URL peut contenir des échappements d' URL qui doivent être traduits et ces échappements sont codés en pourcentage , comme %%30%30. (Une liste plus exhaustive d'URL s'échappe ici ).
La fonctionnalité qui gère cette traduction d'URL est celle qui finit par planter, car elle reçoit les entrées que les développeurs n'avaient pas prévues / traitées.

Voici un résumé du changement de code qui a résolu le problème:

Traitez correctement les échappements imbriqués problématiques dans les chemins d’URL.

Plus précisément, si une sortie d'espace libre dans l'entrée conduit à l'URL de sortie contenant une nouvelle séquence d'échappement, par exemple en convertissant l'entrée "%% 30% 30" en "% 00", échappez le "%" initial en tant que "% 25" pour garantir la sortie. La séquence n'est pas traitée comme une nouvelle séquence d'échappement valide.

Cela garantit que la canonisation de la même URL une deuxième fois ne la modifiera pas, ce qui est important pour éviter les plantages et autres bogues à divers endroits dans les versions de débogage et de publication.

miyalys
la source
3
Pour plus de clarté, pas de problème avec FireFox ou IE 11
Dave
6
Considérant qu'Opera est basé sur le moteur Chrome, il n'est pas étonnant qu'il se bloque également. C’est une bonne chose d’avoir plusieurs moteurs de rendu.
Ramhound
8
Mais pourquoi ça se passe en vol stationnaire ? Je veux dire, quand je survole un lien, il n'y a pas de recherche, alors pourquoi il se bloque?
LINQ
4
La cause du bogue n'est pas encore claire, mais certains pensent que cela est lié au URL canonicalizer, qui commence apparemment à fonctionner dès que vous survolez un lien, peut-être pour afficher le lien dans la barre d'état du navigateur? Je ne peux pas vous donner une réponse précise, mais quand une URL est écrite en HTML, elle peut être écrite sous une forme telle que /homeou ../../home, mais les navigateurs doivent traduire cette URL en quelque chose avec un protocole et un domaine, comme http://superuser.com/home, etc. peut-être que la gestion des fonctionnalités est ce qui finit par planter, car elle reçoit des entrées inattendues?
miyalys
15
@ JéfersonBueno Lorsque vous survolez un lien, Chrome l'affiche dans le coin inférieur gauche. Cela nécessite certains traitements, y compris la "traduction" de caractères spécialement codés. Ce traitement est erroné et provoque le crash de tout le programme.
Fabio dit réintégrer Monica le
11

Comme le dit Fabio Turati,

Lorsque vous survolez un lien, Chrome l'affiche dans le coin inférieur gauche. Cela nécessite certains traitements, y compris la "traduction" de caractères spécialement codés.

Cependant, d'après votre commentaire et votre commentaire, je pense que vous êtes plus préoccupé par le fait que Chrome se connecte ou non au lien en arrière-plan. C'est le cas d' autres navigateurs modernes ( Firefox , Opera ). Vous souhaiterez peut-être désactiver le prélecture dans les préférences de Chrome ou installer uBlock Origin pour obtenir davantage de paramètres de confidentialité.

jingyu9575
la source
6

Je voulais donner quelques précisions sur ce qui se passe exactement ici.

Fondamentalement,% 30 est un 0 codé en URL, et% 00 est un NULL codé en URL (affiché en binaire sous la forme 0000 0000). Donc, si vous avez une URL avec un caractère codé imbriqué qui décodera en NULL, le bogue se produit.

Chrome procède comme suit lors de la canonisation d'une URL (source: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • Une chaîne d'entrée "http: //a.com/%%30%30" n'est pas échappée vers " http://a.com/%00 " et est considérée comme une GURL valide.
  • Cette GURL est finalement envoyée à GURLToDatabaseURL (), qui appelle ReplaceComponents () dessus pour supprimer le nom d'utilisateur et le mot de passe.
  • ReplaceComponents () re-canonicalise l'URL.
  • La canonisation du chemin frappe la séquence "% 00", unescapes, voit qu'il s'agit d'un caractère 0 invalide dans les URL, le laisse échappé, mais marque l'URL résultante comme non valide.
  • Une fois que nous sommes revenus à GURLToDatabaseURL (), celui-ci appelle .spec () sur la nouvelle URL, en s’attendant à ce qu’elle soit valide, car l’URL d’entrée était garantie et nous avons simplement supprimé le nom d’utilisateur et le mot de passe. Cette DCHECKs.

Donc, l'URL est d'abord considéré comme valide, mais après la suppression de certaines données privées, il est invalidé. Cependant, une fois ces données supprimées, la fonction qui a appelé ce code particulier attend une URL valide.

Une partie de la raison pour laquelle cette URL est considérée comme non valide tient au fait que NULL est utilisé dans un certain nombre de logiciels et de langages plus anciens pour indiquer la fin d'une chaîne (car il s'agit essentiellement de 8 zéros dans une ligne, ce qui est facile à détecter pour un ordinateur).

Nzall
la source