Що відбувається, коли я наведу курсор на посилання в Chrome?


40

Коли це посилання ( http://a//%%30%30 ) натиснута в Google Chrome, Chrome розбиває та закриває всі вкладки та екземпляри.

Але, в деяких випадках, мені потрібно лише навести курсор на посилання, а на вкладці збій.

Що відбувається, коли я наведу курсор на це посилання? Я маю на увазі, що робить Chrome, коли посилання знаходиться над?


12
Ось великий фільм Тома Скотта, який говорить про те, що він думає, що відбувається в хромі youtube.com/watch?v=0fw5Cyh21TE
DLeh

5
Цю помилку було виправлено Chrome 45.0.2454.101 . Вона все ще була присутня в Росії Chrome 45.0.2454.99 .
Deltik

Помилка ні виправлено в Chrome 45.0.2454.101 (принаймні на Mac OS 10.10.5 Chrome все ще руйнується).
math

Відповіді:


42

Збій відбувся через нещодавно виявлену помилку Chrome - та інші Браузери WebKit (!) * - специфічно пов'язані з ними %%30%30, %0%30 або %%300 як частина URL-адреси, яка все в кінцевому підсумку складається з одного символу: нуль . Ви можете прочитати більше про помилку тут .

Це не помилка, яка впливає на більшість посилань, тому ви зазвичай не повинні турбуватися про наведення курсору на посилання.

Примітки:
* Інший Браузери WebKit включають Safari, Opera, браузер Steam, Midori, S60 (Symbian), браузер Blackberry і браузер Playstation 3 - але ні Firefox, Internet Explorer або Edge.

Редагувати: Ця помилка тепер виправлена Chrome 45.0.2454.101 як Deltik вказує на те.

Детальніше про те, що відбувається

Проблема пов'язана з URL canonicalizer , яка запускається відразу після наведення курсору миші на посилання - можливо, для відображення посилання в рядку стану браузера та для попередній вибір веб-сторінку, щоб вона завантажувалася швидше після натискання.

Що стосується ролі канонізатора URL:
При написанні URL-адреси HTML, вона може бути написана у такій формі, як /home або ../../home, але браузерам потрібно перекласти цю URL-адресу на щось, що має протокол і домен http://superuser.com/home. Крім того, URL може містити Видалення URL-адрес що потрібно бути перекладено , і ці втечі є % кодується , люблю %%30%30. (Більш вичерпний список викидів URL-адрес тут ).
Функціональність обробки цього Переклад URL-адрес це те, що закінчується збоями, тому що він отримує вхід, який розробники не очікували / обробляли.

Ось підсумок зміни коду, який вирішив проблему:

Правильно керуйте проблемними вкладеними втечами у шляху URL.

Зокрема, якщо unescaping на вході призводить до вихідного URL   що містить нову витікаючу послідовність, наприклад, перетворення вхідних даних "%% 30% 30"   "% 00", щоб уникнути виводу "%" як "% 25"   Послідовність не розглядається як нова діюча послідовність.

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


3
Для ясності, немає проблем з FireFox або IE 11
Dave

6
Враховуючи, що Opera базується на движку Chrome, це не вражає те, що він також падає. Котрий являє собою причину маючу декілька двигунів надання є гарна річ.
Ramhound

8
Але чому це відбувається на hover ? Я маю на увазі, коли я наводжу посилання, немає жодного пошуку, то чому він зривається?
LINQ

4
Це ще не ясно, що викликає помилку, але деякі вважають, що це пов'язано з URL canonicalizer, який, мабуть, починає працювати, як тільки ви наведете курсор миші на посилання, можливо, для відображення посилання в рядку стану браузера? Я не можу дати вам певну відповідь, однак, коли URL написано в HTML, він може бути написаний у такій формі, як /home або ../../home , але браузерам потрібно перекласти цю URL-адресу на щось, що має протокол і домен http://superuser.com/home, отже, можливо, функціональність, яка є тим, що закінчується збоєм, тому що вона отримує несподіваний вхід?
miyalys

15
@ JéfersonBueno При наведенні курсору миші на посилання Chrome відображає його в лівому нижньому куті. Це вимагає певної обробки, включаючи "переклад" спеціально закодованих символів. Ця обробка є помилковою і призводить до збою всієї програми.
Fabio Turati

11

Як каже Фабіо Тураті,

Коли ви наводите курсор на посилання, Chrome відображає його в лівому нижньому куті. Це вимагає певної обробки, включаючи "переклад" спеціально закодованих символів.

Однак, з вашої публікації та коментаря, я думаю, ви більше стурбовані тим, чи підключається Chrome до посилання у фоновому режимі. Це робить , так само як і інші сучасні веб-переглядачі ( Firefox , Опера ). Можливо, потрібно вимкнути попереднє завантаження в налаштуваннях Chrome або встановити Початок uBlock щоб отримати додаткові налаштування конфіденційності.


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-адресу.
  • Canonicalization шляху потрапляє в "% 00" послідовність, unescapes, бачить, що це 0 char, який є недійсним у URL, залишає його уникнуто   позначає отриману URL-адресу як недійсну.
  • Коли ми повернемося до GURLToDatabaseURL (), він викликає .spec () на новій URL-адресі, очікуючи, що він буде дійсним, оскільки вхідна URL-адреса була гарантована   щоб бути дійсною, і ми просто видалили ім'я користувача та пароль. Це   DCHECK.

Отже, URL-адреса спочатку вважається дійсною, але після видалення певних особистих даних вона припиняється. Однак після видалення даних функція, яка називає цей конкретний код, очікує на дійсний URL.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.