O que acontece quando eu passo o mouse sobre um link no Chrome?

40

Quando este link ( http://a//%%30%30 ) é clicado no Google Chrome, o Chrome quebra e fecha todas as guias e instâncias.

Mas, em alguns casos, só preciso passar o mouse sobre o link, e a guia falha.

O que acontece quando eu passar este link? Quero dizer, o que o Chrome faz quando um link é passado?

    
por LINQ 24.09.2015 / 16:04

3 respostas

42

O problema ocorreu devido a um bug recentemente descoberto no Chrome - e a outros navegadores WebKit (!) * - especificamente relacionado a %%30%30 , %0%30 ou %%300 como parte da URL, que internamente todos acabam representando o mesmo símbolo: null . Você pode ler mais sobre o bug aqui .

Não é um bug que afeta a maioria dos links, então você geralmente não precisa se preocupar em passar o mouse sobre links.

Notas:
* Outros navegadores WebKit incluem Safari, Opera, Navegador Steam, Midori, S60 (Symbian), navegador Blackberry e navegador do Playstation 3 - mas não Firefox, Internet Explorer ou Edge.

Editar: Este bug foi corrigido no Chrome 45.0.2454.101 como Deltik indica.

Mais sobre o que acontece

O problema está relacionado ao canonicalizer de URL , que é executado assim que você passa o mouse sobre um link - possivelmente para exibir o link na barra de status do navegador e para precuperando a página da Web para que seja carregada mais rapidamente depois de clicada.

Quanto ao papel do canonicalizador de URL:
Quando um URL é escrito em HTML , pode ser escrito em um formulário como /home ou ../../home , mas os navegadores também precisam traduzir esse URL para algo com um protocolo e um domínio, como http://superuser.com/home . Além disso, o URL pode conter URL Escapes que precisam ser traduzidos , e esses escapam são por cento codificados , como %%30%30 . (Uma lista mais exaustiva de URL escapa aqui ).
A funcionalidade que lida com essa tradução de URL é o que está acabando, porque recebe entrada que os desenvolvedores não esperavam / manipulavam.

Aqui está um resumo da alteração do código que resolveu o problema:

Correctly handle problematic nested escapes in URL paths.

Specifically, if unescaping in the input leads to the output URL containing a new escaped sequence, e.g. converting the input "%%30%30" to "%00", escape the leading '%' as "%25" to ensure the output sequence is not treated as a new valid escape sequence.

This ensures that canonicalizing the same URL a second time won't make changes to it, which is important for avoiding crashes and other bugs in a variety of places in both debug and release builds.

    
por 24.09.2015 / 16:17
11

Como Fabio Turati diz,

When you hover over a link, Chrome displays it in the lower left corner. This requires some processing, including the "translation" of specially encoded characters.

No entanto, da sua postagem e comentário, acho que você está mais preocupado em saber se o Chrome se conecta ao link em segundo plano. Ele faz , assim como outros navegadores modernos ( Firefox , Opera ). Você pode desativar a pré-busca nas preferências do Chrome ou instalar uBlock Origin para obter mais configurações de privacidade.

    
por 25.09.2015 / 04:08
6

Eu gostaria de dar mais esclarecimentos sobre o que exatamente acontece aqui.

Basicamente,% 30 é um 0 codificado por URL, e% 00 é um NULL codificado por URL (que é exibido em binário como 0000 0000). Portanto, se você tiver uma URL que tenha um caractere codificado aninhado que decodificará para NULL, ocorrerá o erro.

O Chrome faz o seguinte ao canonizar um URL (fonte: link ) :

  • An input string "http: //a.com/%%30%30" is unescaped to "http://a.com/%00" and considered a valid GURL.
  • This GURL is eventually sent to GURLToDatabaseURL(), which calls ReplaceComponents() on it to strip the username and password.
  • ReplaceComponents() re-canonicalizes the URL.
  • Canonicalization of the path hits the "%00" sequence, unescapes, sees this is a 0 char which is invalid in URLs, leaves it escaped, but marks the resulting URL as invalid.
  • Once we return back to GURLToDatabaseURL(), it calls .spec() on the new URL, expecting it to be valid, since the input URL was guaranteed to be valid and we merely removed the username and password. This DCHECKs.

Assim, o URL é considerado primeiro válido, mas depois de remover determinados dados privados, ele é invalidado. No entanto, depois que esses dados forem removidos, a função que chamou esse código específico espera uma URL válida.

Parte do motivo pelo qual esse URL é considerado inválido é porque o NULL é usado em vários softwares e idiomas mais antigos para indicar o final de uma string (porque é basicamente 8 zeros em uma linha, que é fácil de detectar por um computador).

    
por 25.09.2015 / 13:39