Что произойдет, когда я наведу курсор мыши на ссылку в Chrome?

40

При нажатии на эту ссылку ( http://a//%%30%30) в Google Chrome, Chrome разрывает и закрывает все вкладки и экземпляры.

Но в некоторых случаях мне нужно только навести указатель мыши на ссылку, и вкладка вылетает.

Что произойдет, когда я наведусь на эту ссылку? Я имею в виду, что делает Chrome при наведении ссылки?

LINQ
источник
12
Вот отличное видео Тома Скотта, в котором рассказывается о том, что, по его мнению, происходит в chrome youtube.com/watch?v=0fw5Cyh21TE
DLeh
5
Эта ошибка была исправлена ​​в Chrome 45.0.2454.101 . Это все еще присутствовало в Chrome 45.0.2454.99 .
Дельтик
Ошибка не исправлена ​​в Chrome 45.0.2454.101 (по крайней мере, в Mac OS 10.10.5 Chrome все еще падает).
математика

Ответы:

42

Сбой происходит из-за недавно обнаруженной ошибки в Chrome - и других браузерах WebKit (!) * - специально связанных либо с одним из них %%30%30, %0%30либо %%300с частью URL-адреса, которые внутри все представляют один и тот же символ: null . Вы можете прочитать больше об ошибке здесь .

Это не ошибка, которая затрагивает большинство ссылок, поэтому вам не нужно беспокоиться о наведении курсора на ссылки.

Примечания:
* Другие браузеры 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, он может быть записан в такой форме, как /homeили ../../home, но браузеры должны преобразовать этот URL во что-то с протоколом и доменом, например http://superuser.com/home. Кроме того, URL - адрес может содержать URL Escapes которые должны быть переведены , и эти побеги являются процента закодирован , как %%30%30. (Более исчерпывающий список URL избегает здесь ).
Функциональность, обрабатывающая этот перевод URL, является тем, что в конечном итоге приводит к сбою, потому что он получает ввод, который разработчики не ожидали / не обрабатывали.

Вот краткое описание изменения кода, которое решило проблему:

Правильно обрабатывать проблемные вложенные переходы в URL-путях.

В частности, если удаление из входных данных приводит к выходному URL-адресу, содержащему новую экранированную последовательность, например, преобразование входных данных "%% 30% 30" в "% 00", экранируйте ведущий "%" как "% 25", чтобы обеспечить вывод последовательность не обрабатывается как новая допустимая escape-последовательность.

Это гарантирует, что канонизация одного и того же URL-адреса во второй раз не изменит его, что важно для предотвращения сбоев и других ошибок в различных местах как в отладочной, так и в выпускной сборках.

miyalys
источник
3
Для ясности, нет проблем с FireFox или IE 11
Дейв
6
Рассмотрение Opera основано на движке Chrome, который не шокирует, что он также падает. Что является причиной того, что несколько движков рендеринга - это хорошо.
Ramhound
8
Но почему это происходит при наведении ? Я имею в виду, что при наведении на ссылку поиск не производится, так почему же происходит сбой?
LINQ
4
Пока не ясно, что является причиной ошибки, но некоторые думают, что это связано с тем URL canonicalizer, что, очевидно, начинает работать, как только вы наводите указатель мыши на ссылку, возможно, для отображения ссылки в строке состояния браузера? Я не могу дать вам определенный ответ, однако, когда URL-адрес написан в формате HTML, он может быть записан в такой форме, как /homeили ../../home, но браузеры должны преобразовать этот URL-адрес во что-то с протоколом и доменом тоже, например http://superuser.com/home, так может быть, функциональная обработка, которая в конечном итоге приводит к сбою, потому что она получает неожиданный ввод?
miyalys
15
@ JéfersonBueno При наведении курсора на ссылку Chrome отображает ее в левом нижнем углу. Это требует некоторой обработки, включая «перевод» специально закодированных символов. Эта обработка содержит ошибки и вызывает сбой всей программы.
Фабио говорит восстановить Монику
11

Как говорит Фабио Турати,

Когда вы наводите курсор на ссылку, Chrome отображает ее в левом нижнем углу. Это требует некоторой обработки, включая «перевод» специально закодированных символов.

Однако из вашего поста и комментария я думаю, что вас больше беспокоит вопрос о том, подключается ли Chrome к ссылке в фоновом режиме. Это так, как и другие современные браузеры ( Firefox , Opera ). Вы можете отключить предварительную выборку в настройках Chrome или установить uBlock Origin, чтобы получить больше настроек конфиденциальности.

jingyu9575
источник
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», отменяет, видит, что это 0 символ, который недопустим в URL, оставляет его экранированным, но помечает полученный URL как недействительный.
  • Как только мы возвращаемся к GURLToDatabaseURL (), он вызывает .spec () для нового URL, ожидая, что он будет действительным, поскольку входной URL гарантированно был действительным, и мы просто удалили имя пользователя и пароль. Это чеки.

Таким образом, URL сначала считается действительным, но после удаления определенных личных данных он становится недействительным. Однако после удаления этих данных функция, вызвавшая этот конкретный код, ожидает действительный URL-адрес.

Частично причина, по которой этот URL-адрес считается недействительным, заключается в том, что NULL используется во многих старых программах и языках для обозначения конца строки (потому что это в основном 8 нулей в строке, что легко обнаружить для компьютера).

Nzall
источник