![当我将鼠标悬停在 Chrome 中的链接上时会发生什么?](https://linux22.com/image/1466927/%E5%BD%93%E6%88%91%E5%B0%86%E9%BC%A0%E6%A0%87%E6%82%AC%E5%81%9C%E5%9C%A8%20Chrome%20%E4%B8%AD%E7%9A%84%E9%93%BE%E6%8E%A5%E4%B8%8A%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
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
../../home
http://superuser.com/home
URL 转义需要已翻译, 还有这些逃脱是百分比编码,例如%%30%30
。(更详尽的 URL 转义列表这里)
处理此问题的功能URL 翻译 最终导致崩溃,因为它收到了开发人员未预料到/处理的输入。
以下是修复该问题的代码更改摘要:
正确处理 URL 路径中有问题的嵌套转义。
具体来说,如果输入中的转义导致输出 URL 包含新的转义序列,例如将输入“%%30%30”转换为“%00”,则将前导“%”转义为“%25”,以确保输出序列不会被视为新的有效转义序列。
这可确保第二次规范化同一个 URL 不会对其进行更改,这对于避免调试和发布版本中各处出现崩溃和其他错误非常重要。
答案2
答案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 个零,这很容易被计算机检测到)。