¿Qué sucede cuando paso el mouse sobre un enlace en Chrome?

40

Cuando http://a//%%30%30se hace clic en este enlace ( ) en Google Chrome, Chrome rompe y cierra todas las pestañas e instancias.

Pero, en algunos casos, solo necesito pasar el mouse sobre el enlace y la pestaña se bloquea.

¿Qué sucede cuando paso el mouse sobre este enlace? Quiero decir, ¿qué hace Chrome cuando se cierne un enlace?

LINQ
fuente
12
Aquí hay un gran video de Tom Scott que habla sobre lo que él piensa que está sucediendo en Chrome youtube.com/watch?v=0fw5Cyh21TE
DLeh
55
Este error se corrigió en Chrome 45.0.2454.101 . Todavía estaba presente en Chrome 45.0.2454.99 .
Deltik
El error no se corrigió en Chrome 45.0.2454.101 (al menos en Mac OS 10.10.5 Chrome sigue fallando).
matemáticas

Respuestas:

42

El accidente se debe a un fallo recientemente descubierto en el cromo - y otros navegadores WebKit * - ya sea específicamente relacionada con (!) %%30%30, %0%30O %%300como parte de la URL, que internamente todos terminan representando el mismo símbolo: nula . Puedes leer más sobre el error aquí .

No es un error que afecta a la mayoría de los enlaces, por lo que generalmente no tiene que preocuparse por desplazarse sobre los enlaces.

Notas:
* Otros navegadores WebKit incluyen Safari, Opera, Steam Browser, Midori, S60 (Symbian), Blackberry Browser y el navegador de Playstation 3, pero no Firefox, Internet Explorer o Edge.

Editar: este error ahora se ha corregido en Chrome 45.0.2454.101 como señala Deltik .

Más sobre lo que pasa

El problema está relacionado con el canonicalizador de URL , que se ejecuta tan pronto como pasa el mouse sobre un enlace, posiblemente para mostrar el enlace en la barra de estado del navegador y para buscar previamente la página web para que se cargue más rápido una vez que se hace clic.

En cuanto a la función del canonicalizador de URL:
cuando se escribe una URL HTML, se puede escribir en una forma como /homeo ../../home, pero los navegadores también necesitan traducir esta URL a algo con un protocolo y un dominio, como http://superuser.com/home. Además, la URL puede contener escapes de URL que deben traducirse , y estos escapes están codificados en porcentaje , como %%30%30. (Una lista más exhaustiva de URL escapa aquí ).
La funcionalidad que maneja esta traducción de URL es lo que termina fallando, porque recibe información que los desarrolladores no esperaban / manejaban.

Aquí hay un resumen del cambio de código que solucionó el problema:

Maneje correctamente los escapes anidados problemáticos en las rutas URL.

Específicamente, si la eliminación de escape en la entrada lleva a la URL de salida que contiene una nueva secuencia de escape, por ejemplo, convirtiendo la entrada "%% 30% 30" a "% 00", escape el '%' inicial como "% 25" para garantizar la salida La secuencia no se trata como una nueva secuencia de escape válida.

Esto garantiza que la canonización de la misma URL por segunda vez no realice cambios en ella, lo cual es importante para evitar bloqueos y otros errores en una variedad de lugares, tanto en las versiones de depuración como de lanzamiento.

miyalys
fuente
3
Para mayor claridad, no hay problema con FireFox o IE 11
Dave
66
Teniendo en cuenta que Opera se basa en el motor de Chrome que no es sorprendente, también se bloquea. Cuál es la razón por la que tener múltiples motores de renderizado es algo bueno.
Ramhound
8
Pero, ¿por qué sucede al pasar el ratón ? Quiero decir, cuando coloco el cursor sobre un enlace, no hay búsqueda, entonces, ¿por qué falla?
LINQ
44
Todavía no está claro qué está causando el error, pero algunos piensan que está relacionado con el URL canonicalizer, que aparentemente comienza a ejecutarse tan pronto como pasa el mouse sobre un enlace, ¿tal vez por mostrar el enlace en la barra de estado del navegador? No puedo dar una respuesta cierta, sin embargo, cuando una URL está escrito en HTML, que puede escribirse en una forma tal como /homeo ../../home, pero los navegadores que traducir este URL para algo con un protocolo y un dominio también, al igual que http://superuser.com/home, por lo tal vez el manejo de la funcionalidad que es lo que termina fallando, porque recibe una entrada inesperada?
miyalys
15
@ JéfersonBueno Cuando pasa el cursor sobre un enlace, Chrome lo muestra en la esquina inferior izquierda. Esto requiere cierto procesamiento, incluida la "traducción" de caracteres especialmente codificados. Este procesamiento tiene errores y hace que todo el programa se bloquee.
Fabio dice Restablecer a Mónica
11

Como dice Fabio Turati:

Cuando pasa el cursor sobre un enlace, Chrome lo muestra en la esquina inferior izquierda. Esto requiere cierto procesamiento, incluida la "traducción" de caracteres especialmente codificados.

Sin embargo, por su publicación y comentario, creo que le preocupa más si Chrome se conecta al enlace en segundo plano. Lo hace , al igual que otros navegadores modernos ( Firefox , Opera ). Es posible que desee deshabilitar la captación previa en las preferencias de Chrome o instalar uBlock Origin para obtener más configuraciones de privacidad.

jingyu9575
fuente
6

Quería dar más aclaraciones sobre lo que sucede exactamente aquí.

Básicamente,% 30 es un 0 codificado por URL y% 00 es un NULL codificado por URL (que se muestra en binario como 0000 0000). Entonces, si tiene una URL que tiene un carácter codificado anidado que se decodificará en NULL, se produce el error.

Chrome hace lo siguiente al canonizar una URL (fuente: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • Una cadena de entrada "http: //a.com/%%30%30" no tiene escape a " http://a.com/%00 " y se considera una GURL válida.
  • Este GURL finalmente se envía a GURLToDatabaseURL (), que llama a ReplaceComponents () para eliminar el nombre de usuario y la contraseña.
  • ReemplazarComponentes () vuelve a canonizar la URL.
  • La canonización de la ruta llega a la secuencia "% 00", sin paisajes, ve que este es un carácter 0 que no es válido en las URL, lo deja escapar, pero marca la URL resultante como no válida.
  • Una vez que volvemos a GURLToDatabaseURL (), llama a .spec () en la nueva URL, esperando que sea válida, ya que se garantizó que la URL de entrada era válida y simplemente eliminamos el nombre de usuario y la contraseña. Este DCHECKs.

Por lo tanto, la URL primero se considera válida, pero después de eliminar ciertos datos privados, se invalida. Sin embargo, después de que se eliminan esos datos, la función que llamó a ese código en particular espera una URL válida.

Parte de la razón por la cual esta URL se considera inválida es porque NULL se usa en varios programas e idiomas más antiguos para indicar el final de una cadena (porque son básicamente 8 ceros en una línea, lo cual es fácil de detectar para una computadora).

Nzall
fuente