Apa yang terjadi ketika saya mengarahkan kursor ke tautan di Chrome?

40

Saat tautan ini ( http://a//%%30%30) diklik di Google Chrome, Chrome merusak dan menutup semua tab dan instance.

Tetapi, dalam beberapa kasus saya hanya perlu mengarahkan kursor ke tautan, dan tab macet.

Apa yang terjadi ketika saya mengarahkan kursor ke tautan ini? Maksud saya, apa yang dilakukan Chrome saat tautan melayang?

LINQ
sumber
12
Berikut adalah video hebat Tom Scott yang berbicara tentang apa yang menurutnya terjadi di chrome youtube.com/watch?v=0fw5Cyh21TE
DLeh
5
Bug ini diperbaiki di Chrome 45.0.2454.101 . Itu masih ada di Chrome 45.0.2454.99 .
Deltik
Bug tidak diperbaiki di Chrome 45.0.2454.101 (setidaknya di Mac OS 10.10.5 Chrome masih mogok).
matematika

Jawaban:

42

Kerusakan ini disebabkan oleh bug yang baru-baru ini ditemukan di Chrome - dan browser WebKit lainnya (!) * - yang secara khusus terkait dengan salah satu %%30%30, %0%30atau %%300sebagai bagian dari URL, yang secara internal semua akhirnya mewakili simbol yang sama: null . Anda dapat membaca lebih lanjut tentang bug di sini .

Ini bukan bug yang memengaruhi sebagian besar tautan, jadi Anda biasanya tidak perlu khawatir melayang di atas tautan.

Catatan:
* Browser WebKit lainnya termasuk Safari, Opera, Steam Browser, Midori, S60 (Symbian), Browser Blackberry dan browser Playstation 3 - tetapi tidak Firefox, Internet Explorer atau Edge.

Sunting: Bug ini sekarang telah diperbaiki di Chrome 45.0.2454.101 seperti yang ditunjukkan Deltik .

Lebih banyak tentang apa yang terjadi

Masalahnya adalah berkaitan dengan canonicalizer URL , yang berjalan segera setelah Anda hover atas link - mungkin untuk menampilkan link di status bar browser, dan untuk prefetching halaman web sehingga beban lebih cepat setelah diklik.

Adapun peran URL canonicalizer:
Ketika sebuah URL ditulis HTML, itu dapat ditulis dalam bentuk seperti /homeatau ../../home, tetapi browser perlu menerjemahkan URL ini ke sesuatu dengan protokol dan domain juga, seperti http://superuser.com/home. Lebih jauh lagi, URL dapat berisi URL Escapes yang perlu diterjemahkan , dan lolos ini adalah persen dikodekan , seperti %%30%30. (Daftar URL yang lebih lengkap lolos di sini ).
Fungsionalitas yang menangani terjemahan URL ini adalah yang akhirnya mogok, karena menerima masukan yang tidak diharapkan / ditangani oleh pengembang.

Berikut ringkasan perubahan kode yang memperbaiki masalah:

Benar menangani lolos bersarang bermasalah di jalur URL.

Khususnya, jika tidak keluar dalam input mengarah ke URL output yang berisi urutan baru yang lolos, misalnya mengonversi input "%% 30% 30" menjadi "% 00", keluar dari '%' sebagai "% 25" untuk memastikan output urutan tidak diperlakukan sebagai urutan melarikan diri baru yang valid.

Ini memastikan bahwa kanonikkan URL yang sama untuk kedua kalinya tidak akan mengubahnya, yang penting untuk menghindari kerusakan dan bug lain di berbagai tempat di debug dan rilis build.

miyalys
sumber
3
Untuk kejelasan, tidak ada masalah dengan FireFox atau IE 11
Dave
6
Menimbang Opera didasarkan pada mesin Chrome yang tidak mengejutkan bahwa ia juga crash. Itulah sebabnya memiliki beberapa mesin rendering adalah hal yang baik.
Ramhound
8
Tapi mengapa itu terjadi saat melayang ? Maksud saya, ketika saya mengarahkan tautan, tidak ada pencarian, jadi mengapa itu macet?
LINQ
4
Belum jelas apa yang menyebabkan bug, tetapi beberapa orang berpikir itu terkait dengan URL canonicalizer, yang tampaknya mulai berjalan segera setelah Anda mengarahkan tautan, mungkin untuk menampilkan tautan di bilah status browser? Saya tidak bisa memberikan jawaban tertentu kepada Anda, namun ketika URL ditulis dalam HTML, mungkin ditulis dalam bentuk seperti /homeatau ../../home, tetapi browser perlu menerjemahkan URL ini ke sesuatu dengan protokol dan domain juga, seperti http://superuser.com/home, jadi mungkin penanganan fungsionalitas itulah yang akhirnya mogok, karena menerima input yang tidak terduga?
miyalys
15
@ JéfersonBueno Saat Anda mengarahkan kursor ke tautan, Chrome menampilkannya di sudut kiri bawah. Ini memerlukan beberapa pemrosesan, termasuk "terjemahan" dari karakter yang dikodekan secara khusus. Pemrosesan ini bermasalah, dan menyebabkan seluruh program macet.
Fabio berkata Reinstate Monica
11

Seperti yang dikatakan Fabio Turati,

Saat Anda mengarahkan kursor ke tautan, Chrome menampilkannya di sudut kiri bawah. Ini memerlukan beberapa pemrosesan, termasuk "terjemahan" dari karakter yang dikodekan secara khusus.

Namun, dari pos dan komentar Anda, saya pikir Anda lebih peduli tentang apakah Chrome terhubung ke tautan di latar belakang. Ya , begitu juga browser modern lainnya ( Firefox , Opera ). Anda mungkin ingin menonaktifkan prefetching di preferensi Chrome, atau menginstal uBlock Origin untuk mendapatkan lebih banyak pengaturan privasi.

jingyu9575
sumber
6

Saya ingin memberikan klarifikasi lebih lanjut tentang apa yang sebenarnya terjadi di sini.

Pada dasarnya,% 30 adalah URL-kode 0, dan% 00 adalah URL-kode NULL (yang ditampilkan dalam biner sebagai 0000 0000). Jadi, jika Anda memiliki URL yang memiliki karakter penyandian bersarang yang akan diterjemahkan ke NULL, bug itu terjadi.

Chrome melakukan hal berikut ketika mengkanoniskan URL (sumber: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • String input "http: //a.com/%%30%30" tidak terhapus ke " http://a.com/%00 " dan dianggap sebagai GURL yang valid.
  • GURL ini akhirnya dikirim ke GURLToDatabaseURL (), yang memanggil ReplaceComponents () di dalamnya untuk menghapus nama pengguna dan kata sandi.
  • ReplaceComponents () me-kanoniskan ulang URL.
  • Kanonikalisasi jalur mengenai urutan "% 00", tidak terhapus, melihat ini adalah karakter 0 yang tidak valid di URL, membiarkannya lolos, tetapi menandai URL yang dihasilkan sebagai tidak valid.
  • Setelah kami kembali ke GURLToDatabaseURL (), ia memanggil .spec () di URL baru, mengharapkannya valid, karena URL input dijamin valid dan kami hanya menghapus nama pengguna dan kata sandi. DCHECKs ini.

Jadi URL pertama dianggap valid, tetapi setelah menghapus data pribadi tertentu, itu tidak valid. Namun, setelah data itu dihapus, fungsi yang memanggil kode tertentu itu mengharapkan URL yang valid.

Sebagian alasan mengapa URL ini dianggap tidak valid adalah karena NULL digunakan dalam sejumlah perangkat lunak dan bahasa yang lebih lama untuk menunjukkan akhir suatu string (karena pada dasarnya 8 nol dalam satu baris, yang mudah dideteksi untuk komputer).

Nzall
sumber