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

Jéf*_*eno 40 crash google-chrome

http://a//%%30%30在 Google Chrome 中单击此链接 ( ) 时,Chrome 会中断并关闭所有选项卡和实例。

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

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

miy*_*lys 43

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

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

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

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

更多关于会发生什么

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

至于 URL canonicalizer 的作用:
当 URL 写成 时HTML,它可能会写成/home或等形式../../home,但浏览器也需要将此 URL 转换为具有协议和域的内容,例如http://superuser.com/home. 此外,URL 可能包含需要翻译的URL 转义,这些转义百分比编码的,如. (此处提供了更详尽的 URL 转义列表)。 处理这个URL 转换的功能 最终会崩溃,因为它接收到开发人员没有预料到/处理的输入。%%30%30

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

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

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

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

  • @JéfersonBueno 当您将鼠标悬停在链接上时,Chrome 会将其显示在左下角。这需要一些处理,包括特殊编码字符的“翻译”。这种处理有问题,会导致整个程序崩溃。 (15认同)
  • 但是为什么会在 ** 悬停** 时发生?我的意思是,当我悬停一个链接时,没有搜索,为什么会崩溃? (8认同)
  • 考虑到 Opera 基于 Chrome 引擎,这并不令人震惊,它也会崩溃。这就是拥有多个渲染引擎是一件好事的原因。 (6认同)
  • 目前还不清楚是什么导致了这个错误,但有些人认为它与“URL canonicalizer”有关,当你将鼠标悬停在链接上时,它显然开始运行,也许是为了在浏览器的状态栏中显示链接?我不能给你一个确定的答案,但是当一个 URL 是用 HTML 写的时,它可能会写成诸如 `/home` 或 `../../home` 的形式,但是浏览器需要翻译这个 URL也有协议和域的东西,比如`http://superuser.com/home`,所以也许是功能处理最终崩溃了,因为它收到了意外的输入? (4认同)
  • 为清楚起见,FireFox 或 IE 11 没有问题 (3认同)
  • 顺便说一句,它还会使 Steam 的内部浏览器崩溃。 (2认同)

jin*_*575 11

正如法比奥·图拉蒂所说,

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

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


Nza*_*all 6

我想进一步说明这里究竟发生了什么。

基本上,%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 被保证是有效的,我们只是删除了用户名和密码。这个 DCHECKs。

所以 URL 首先被认为是有效的,但在删除某些私人数据后,它就失效了。但是,在删除该数据后,调用该特定代码的函数需要一个有效的 URL。

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