Co się stanie, gdy zatrzymam kursor myszy nad linkiem w Chrome?

40

Po kliknięciu tego linku ( http://a//%%30%30) w Google Chrome, Chrome łamie i zamyka wszystkie karty i instancje.

Ale w niektórych przypadkach wystarczy najechać kursorem na link, a karta zawiesza się.

Co się stanie, gdy zatrzymam kursor myszy nad tym linkiem? Chodzi mi o to, co Chrome robi po najechaniu myszką na link?

LINQ
źródło
12
Oto świetny film Toma Scotta, który opowiada o tym, co według niego dzieje się w chrome youtube.com/watch?v=0fw5Cyh21TE
DLeh
5
Ten błąd został naprawiony w Chrome 45.0.2454.101 . Wciąż był obecny w przeglądarce Chrome 45.0.2454.99 .
Deltik,
Błąd nie został naprawiony w Chrome 45.0.2454.101 (przynajmniej w Mac OS 10.10.5 Chrome nadal ulega awarii).
matematyka

Odpowiedzi:

42

Katastrofa jest wynikiem niedawno odkrytych błędów w Chrome - oraz innych przeglądarek WebKit * - specyficznie związane albo (!) %%30%30, %0%30Albo %%300jako część zawartości, co wewnętrznie wszystko skończy się reprezentujący ten sam symbol: zerowy . Możesz przeczytać więcej o błędzie tutaj .

To nie jest błąd, który wpływa na większość linków, więc ogólnie nie musisz się martwić o najechanie kursorem na linki.

Uwagi:
* Inne przeglądarki WebKit to Safari, Opera, Steam Browser, Midori, S60 (Symbian), Blackberry Browser i Playstation 3 - ale nie Firefox, Internet Explorer lub Edge.

Edycja: Ten błąd został teraz naprawiony w Chrome 45.0.2454.101, jak wskazuje Deltik .

Więcej o tym, co się dzieje

Problem związany jest z canonicalizerem URL , który działa, gdy tylko umieścisz kursor nad linkiem - być może do wyświetlania linku na pasku stanu przeglądarki i do wstępnego pobrania strony internetowej, aby ładowała się szybciej po kliknięciu.

Jeśli chodzi o rolę kanonizatora adresów URL:
gdy adres URL jest zapisywany HTML, może być napisany w formie takiej jak /homelub ../../home, ale przeglądarki muszą tłumaczyć ten adres URL na coś z protokołem i domeną, jak http://superuser.com/home. Ponadto adres URL może zawierać sekwencje specjalne URL, które muszą zostać przetłumaczone , a te sekwencje kodowane są w procentach , np %%30%30. (Bardziej wyczerpująca lista znaków ucieczki tutaj ).
Funkcjonalność obsługi tego tłumaczenia URL -a kończy się awarią, ponieważ otrzymuje dane, których deweloperzy nie oczekiwali / nie obsłużyli.

Oto podsumowanie zmiany kodu, która rozwiązała problem:

Prawidłowo obsługuj problematyczne zagnieżdżone sekwencje specjalne w ścieżkach adresów URL.

W szczególności, jeśli usunięcie danych wejściowych prowadzi do wyjściowego adresu URL zawierającego nową sekwencję zmiany znaczenia, np. Konwersję danych wejściowych „%% 30% 30” na „% 00”, należy wstawić wiodące „%” jako „% 25”, aby zapewnić wynik sekwencja nie jest traktowana jako nowa poprawna sekwencja zmiany znaczenia.

Zapewnia to, że kanonizacja tego samego adresu URL po raz drugi nie spowoduje zmian w nim, co jest ważne dla uniknięcia awarii i innych błędów w różnych miejscach zarówno w kompilacjach debugowania, jak i wydań.

miyalys
źródło
3
Dla jasności nie ma problemu z FireFox lub IE 11
Dave
6
Rozważanie Opery opiera się na silniku Chrome, który nie jest szokujący, że również ulega awarii. Dlatego posiadanie wielu silników renderujących jest dobrą rzeczą.
Ramhound
8
Ale dlaczego dzieje się po najechaniu myszą ? Mam na myśli, że po najechaniu kursorem na link nie ma wyszukiwania, więc dlaczego się zawiesza?
LINQ
4
Nie jest jeszcze jasne, co powoduje błąd, ale niektórzy sądzą, że jest to związane z tym URL canonicalizer, który najwyraźniej zaczyna działać, gdy tylko umieścisz kursor nad linkiem, być może w celu wyświetlenia linku na pasku stanu przeglądarki? Nie mogę dać ci pewnej odpowiedzi, jednak gdy URL jest zapisany w HTML, może być napisany w formie takiej jak /homelub ../../home, ale przeglądarki muszą przetłumaczyć ten URL na coś z protokołem i domeną, tak jak http://superuser.com/home, więc może obsługa funkcjonalności, która kończy się awarią, ponieważ otrzymuje nieoczekiwane dane wejściowe?
miyalys
15
@ JéfersonBueno Po najechaniu kursorem na link Chrome wyświetla go w lewym dolnym rogu. Wymaga to pewnego przetwarzania, w tym „tłumaczenia” specjalnie zakodowanych znaków. To przetwarzanie jest błędne i powoduje awarię całego programu.
Fabio mówi Przywróć Monikę
11

Jak mówi Fabio Turati,

Po najechaniu kursorem na link Chrome wyświetla go w lewym dolnym rogu. Wymaga to pewnego przetwarzania, w tym „tłumaczenia” specjalnie zakodowanych znaków.

Jednak z twojego postu i komentarza myślę, że bardziej martwi Cię to, czy Chrome łączy się z linkiem w tle. Tak , podobnie jak inne nowoczesne przeglądarki ( Firefox , Opera ). Możesz wyłączyć pobieranie wstępne w preferencjach Chrome lub zainstalować uBlock Origin, aby uzyskać więcej ustawień prywatności.

jingyu9575
źródło
6

Chciałem wyjaśnić, co dokładnie się tutaj dzieje.

Zasadniczo% 30 to 0 zakodowane w adresie URL, a% 00 to NULL zakodowane w adresie URL (który jest wyświetlany jako binarnie jako 0000 0000). Więc jeśli masz adres URL z zagnieżdżonym kodowanym znakiem, który będzie dekodowany do NULL, błąd występuje.

Chrome dokonuje kanonizacji adresu URL (źródło: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • Ciąg wejściowy „http: //a.com/%%30%30” nie jest zapisywany w „ http://a.com/%00 ” i jest uważany za prawidłowy GURL.
  • Ten GURL jest ostatecznie wysyłany do GURLToDatabaseURL (), który wywołuje na nim funkcję ReplaceComponents () w celu usunięcia nazwy użytkownika i hasła.
  • ReplaceComponents () ponownie kanonizuje adres URL.
  • Kanonizacja ścieżki uderza w sekwencję „% 00”, usuwa ukrycia, widzi, że jest to znak 0, który jest nieprawidłowy w adresach URL, pozostawia znak ucieczki, ale oznacza wynikowy adres URL jako nieprawidłowy.
  • Gdy wrócimy do GURLToDatabaseURL (), wywołuje on .spec () pod nowym adresem URL, oczekując, że będzie on prawidłowy, ponieważ wejściowy adres URL został zagwarantowany jako prawidłowy, a my po prostu usunęliśmy nazwę użytkownika i hasło. To DCHECKs.

Dlatego adres URL jest najpierw uważany za prawidłowy, ale po usunięciu niektórych danych prywatnych jest unieważniany. Jednak po usunięciu tych danych funkcja, która wywołała ten konkretny kod, oczekuje poprawnego adresu URL.

Jednym z powodów, dla których ten adres URL jest uważany za nieprawidłowy, jest to, że NULL jest używany w wielu starszych programach i językach do wskazania końca łańcucha (ponieważ w zasadzie jest to 8 zer w linii, co jest łatwe do wykrycia dla komputera).

Nzall
źródło