将鼠标悬停在Chrome中的链接上会怎样?


40

http://a//%%30%30在Google Chrome浏览器中单击此链接()时,Chrome浏览器会中断并关闭所有标签页和实例。

但是,在某些情况下,我只需要将鼠标悬停在链接上,该选项卡就会崩溃。

将鼠标悬停在此链接上会发生什么?我的意思是,当链接悬停在Chrome上时,Chrome会做什么?


12
这是一部很棒的汤姆·斯科特(Tom Scott)视频,讲述了他认为chrome中正在发生的事情youtube.com/watch?v=0fw5Cyh21TE
DLeh 2015年

5
此错误已在Chrome 45.0.2454.101中修复。它仍然存在于Chrome 45.0.2454.99中
Deltik 2015年

该错误在Chrome 45.0.2454.101中未得到修复(至少在Mac OS 10.10.5上,Chrome仍然崩溃)。
数学

Answers:


42

飞机坠毁是由于最近发现的缺陷 -和其他WebKit浏览器 * -具体涉及到或者(!) %%30%30%0%30%%300作为URL的一部分,内部全部结束了代表同一符号:。您可以在此处阅读有关该错误的更多信息。

这不是影响大多数链接的错误,因此您通常不必担心将鼠标悬停在链接上。

注意:
*其他WebKit浏览器包括Safari,Opera,Steam浏览器,Midori,S60(Symbian),Blackberry Browser和Playstation 3的浏览器- 但不包括 Firefox,Internet Explorer或Edge。

编辑:正如Deltik指出的那样,此错误已在Chrome 45.0.2454.101修复

有关发生的事情的更多信息

该问题与URL canonicalizer有关,该URL会在您将鼠标悬停在链接上后立即运行-可能用于在浏览器的状态栏中显示该链接,以及用于预取网页,以便在单击后加载速度更快。

关于URL规范化器的作用:
写入URL时HTML,可以以诸如/home或的形式编写../../home,但是浏览器也需要将此URL转换为带有协议和域的内容,例如http://superuser.com/home。此外,URL可能包含需要翻译的URL转义,并且这些转义已进行百分比编码,例如。(此处提供了更详尽的URL转义列表)。 处理此URL转换的功能 最终崩溃了,因为它收到了开发人员未曾期望/处理的输入。%%30%30

这是解决问题的代码更改的摘要:

正确处理URL路径中有问题的嵌套转义符。

具体来说,如果输入中的转义导致输出URL包含新的转义序列,例如将输入“ %% 30%30”转换为“%00”,则将前导“%”转义为“%25”以确保输出序列不被视为新的有效转义序列。

这确保了第二次对相同的URL进行规范化不会对其进行更改,这对于避免在调试和发行版本中的各个位置避免崩溃和其他错误很重要。


3
为了清楚起见,FireFox或IE 11没问题
Dave

6
考虑到Opera是基于Chrome引擎,这并不令人震惊,因为它也会崩溃。这就是拥有多个渲染引擎的原因。
Ramhound

8
但是,为什么它会在悬停时发生?我的意思是,当我悬停一个链接时,没有搜索,那么为什么崩溃?
LINQ 2015年

4
目前尚不清楚是什么原因导致了该错误,但有些人认为它与有关URL canonicalizer,当您将鼠标悬停在某个链接上时,它显然会开始运行,也许是为了在浏览器的状态栏中显示该链接?我无法给您一个肯定的答案,但是当URL用HTML编写时,它可能以/home或的形式编写../../home,但是浏览器也需要将此URL转换为具有协议和域的名称,例如http://superuser.com/home,所以也许功能处理最终崩溃了,因为它收到了意外的输入?
miyalys 2015年

15
@JéfersonBueno将鼠标悬停在链接上时,Chrome会将其显示在左下角。这需要一些处理,包括特殊编码字符的“翻译”。此处理是错误的,并导致整个程序崩溃。
Fabio说恢复Monica

11

正如Fabio Turati所说,

将鼠标悬停在链接上时,Chrome会在左下角显示该链接。这需要一些处理,包括特殊编码字符的“翻译”。

但是,从您的帖子和评论中,我认为您更担心Chrome是否在后台连接到链接。确实如此,其他现代浏览器(FirefoxOpera)也是如此。您可能需要在Chrome的偏好设置中禁用预取,或安装uBlock Origin以获取更多隐私设置。


6

我想进一步澄清这里到底发生了什么。

基本上,%30是URL编码的0,%00是URL编码的NULL(以二进制显示为0000 0000)。因此,如果您的URL具有嵌套的编码字符,该字符将被解码为NULL,则会发生错误。

在规范化网址(来源:https : //code.google.com/p/chromium/issues/detail?id=533361#c13)时,Chrome浏览器会执行以下操作:

  • 输入字符串“ http://a.com/%%30%30 ” 未转义为“ http://a.com/%00 ”,并被视为有效的GURL。
  • 该GURL最终发送到GURLToDatabaseURL(),后者在其上调用ReplaceComponents()以剥离用户名和密码。
  • ReplaceComponents()重新规范化URL。
  • 路径的规范化到达“%00”序列,不转义,发现这是一个0字符,在URL中无效,使其转义,但将结果URL标记为无效。
  • 一旦返回GURLToDatabaseURL(),它便会在新URL上调用.spec(),并期望它是有效的,因为可以保证输入URL是有效的,而我们仅删除了用户名和密码。此DCHECKs。

因此,该网址首先被认为是有效的,但是在删除了某些私有数据之后,该网址就无效了。但是,在删除该数据之后,调用该特定代码的函数需要一个有效的URL。

将该URL视为无效的部分原因是,在许多较旧的软件和语言中都使用NULL来指示字符串的结尾(因为它基本上是一行中的8个零,这对于计算机而言很容易检测到)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.