http://a//%%30%30
在Google Chrome浏览器中单击此链接()时,Chrome浏览器会中断并关闭所有标签页和实例。
但是,在某些情况下,我只需要将鼠标悬停在链接上,该选项卡就会崩溃。
将鼠标悬停在此链接上会发生什么?我的意思是,当链接悬停在Chrome上时,Chrome会做什么?
http://a//%%30%30
在Google Chrome浏览器中单击此链接()时,Chrome浏览器会中断并关闭所有标签页和实例。
但是,在某些情况下,我只需要将鼠标悬停在链接上,该选项卡就会崩溃。
将鼠标悬停在此链接上会发生什么?我的意思是,当链接悬停在Chrome上时,Chrome会做什么?
Answers:
飞机坠毁是由于最近发现的缺陷铬 -和其他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进行规范化不会对其进行更改,这对于避免在调试和发行版本中的各个位置避免崩溃和其他错误很重要。
URL canonicalizer
,当您将鼠标悬停在某个链接上时,它显然会开始运行,也许是为了在浏览器的状态栏中显示该链接?我无法给您一个肯定的答案,但是当URL用HTML编写时,它可能以/home
或的形式编写../../home
,但是浏览器也需要将此URL转换为具有协议和域的名称,例如http://superuser.com/home
,所以也许功能处理最终崩溃了,因为它收到了意外的输入?
我想进一步澄清这里到底发生了什么。
基本上,%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个零,这对于计算机而言很容易检测到)。