当我将鼠标悬停在 Chrome 中的链接上时会发生什么?

当我将鼠标悬停在 Chrome 中的链接上时会发生什么?

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

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

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

答案1

崩溃是由于最近发现的一个错误铬合金- 和别的WebKit 浏览器(!)* - 具体与 或%%30%30作为URL 的一部分相关,它们在内部最终都代表相同的符号:%0%30%%300无效的。您可以阅读有关该错误的更多信息这里

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

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

编辑:此错误现已修复Chrome 45.0.2454.101作为德尔蒂克指出。

详细了解发生的事情

问题与URL 规范化器,当你将鼠标悬停在链接上时,它会立即运行 - 可能用于在浏览器的状态栏中显示链接,以及预取一旦点击,网页的加载速度就会更快。

至于 URL 规范化器的作用:
当 URL 以 书写时,它可能被写成或HTML这样的格式,但浏览器需要将此 URL 转换为具有协议和域的内容,例如。此外,URL 可能包含/home../../homehttp://superuser.com/homeURL 转义需要已翻译, 还有这些逃脱百分比编码,例如%%30%30。(更详尽的 URL 转义列表这里
处理此问题的功能URL 翻译 最终导致崩溃,因为它收到了开发人员未预料到/处理的输入。

以下是修复该问题的代码更改摘要:

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

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

这可确保第二次规范化同一个 URL 不会对其进行更改,这对于避免调试和发布版本中各处出现崩溃和其他错误非常重要。

答案2

正如 Fabio Turati 所说,

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

不过,从您的帖子和评论来看,我认为您更关心 Chrome 是否在后台连接该链接。确实如此,其他现代浏览器也是如此(火狐歌剧)。您可能需要在 Chrome 的偏好设置中禁用预取,或者安装uBlock 起源获取更多隐私设置。

答案3

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

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

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

  • 输入字符串“http://a.com/%%30%30”未转义为“http://a.com/%00“并被视为有效的 GURL。
  • 此 GURL 最终被发送到 GURLToDatabaseURL(),它调用 ReplaceComponents() 来删除用户名和密码。
  • ReplaceComponents() 重新规范化 URL。
  • 路径的规范化命中“%00”序列,取消转义,发现这是一个在 URL 中无效的 0 字符,因此将其转义,但将生成的 URL 标记为无效。
  • 一旦我们返回到 GURLToDatabaseURL(),它会在新 URL 上调用 .spec(),期望它是有效的,因为输入的 URL 保证是有效的,我们只是删除了用户名和密码。这 DCHECK。

因此,URL 最初被视为有效,但在删除某些私有数据后,它就失效了。但是,在删除这些数据后,调用该特定代码的函数需要一个有效的 URL。

此 URL 被视为无效的原因之一是,许多较旧的软件和语言使用 NULL 来指示字符串的结束(因为它基本上是一行中的 8 个零,这很容易被计算机检测到)。

相关内容