Was passiert, wenn ich mit dem Mauszeiger über einen Link in Chrome fahre?

40

Wenn http://a//%%30%30in Google Chrome auf diesen Link ( ) geklickt wird, bricht Chrome alle Registerkarten und Instanzen ab und schließt sie.

Aber in einigen Fällen muss ich nur über den Link fahren, und der Tab stürzt ab.

Was passiert, wenn ich über diesen Link schwebe? Ich meine, was macht Chrome, wenn ein Link darüber schwebt?

LINQ
quelle
12
Hier ist ein großer Tom Scott Video , dass die Gespräche über das, was er denkt , geschehen in Chrom youtube.com/watch?v=0fw5Cyh21TE
DLeh
5
Dieser Fehler wurde in Chrome 45.0.2454.101 behoben . Es war noch in Chrome 45.0.2454.99 vorhanden .
Deltik
Der Fehler ist in Chrome 45.0.2454.101 nicht behoben (zumindest unter Mac OS 10.10.5 stürzt Chrome immer noch ab).
Mathe

Antworten:

42

Der Absturz ist aufgrund eines kürzlich entdeckten Fehler in Chrome - und anderen WebKit - Browsern * - speziell auf entweder bezogen (!) %%30%30, %0%30Oder %%300als Teil der URL, die intern alle am Ende , die das gleiche Symbol: null . Sie können mehr über den Bug lesen hier .

Es ist kein Fehler, der die meisten Links betrifft, sodass Sie sich im Allgemeinen nicht darum kümmern müssen, über Links zu schweben.

Hinweise:
* Andere WebKit-Browser sind Safari, Opera, Steam Browser, Midori, S60 (Symbian), Blackberry Browser und der Browser von Playstation 3 - jedoch nicht Firefox, Internet Explorer oder Edge.

Bearbeiten: Dieser Fehler wurde jetzt in Chrome 45.0.2454.101 behoben, wie Deltik hervorhebt .

Mehr darüber, was passiert

Das Problem hängt mit dem URL-Canonicalizer zusammen , der ausgeführt wird, sobald Sie den Mauszeiger über einen Link halten. Möglicherweise wird der Link in der Statusleiste des Browsers angezeigt und die Webseite wird vorab abgerufen, damit sie nach dem Klicken schneller geladen wird.

Was die Rolle des URL-Kanonisierers betrifft:
Wenn eine URL geschrieben ist HTML, kann sie in einer Form wie /homeoder geschrieben sein ../../home, aber Browser müssen diese URL in etwas mit einem Protokoll und einer Domäne wie übersetzen http://superuser.com/home. Des Weiteren kann die URL enthalten URL Escapes , dass Bedarf werden übersetzt , und diese Fluchten sind Prozent codiert , wie %%30%30. (Eine ausführlichere Liste von URLs wird hier nicht angezeigt. )
Die Funktionalität, die mit dieser URL-Übersetzung umgeht, führt zum Absturz, da sie Eingaben erhält, die die Entwickler nicht erwartet hatten.

Hier ist eine Zusammenfassung der Codeänderung, mit der das Problem behoben wurde:

Problematische geschachtelte Escapes in URL-Pfaden richtig behandeln.

Insbesondere wenn das Entkoppeln der Eingabe dazu führt, dass die Ausgabe-URL eine neue maskierte Sequenz enthält, z. B. das Umwandeln der Eingabe "%% 30% 30" in "% 00", maskieren Sie das führende "%" als "% 25", um die Ausgabe sicherzustellen sequence wird nicht als neue gültige Escape-Sequenz behandelt.

Auf diese Weise wird sichergestellt, dass durch das erneute Kanonisieren derselben URL keine Änderungen vorgenommen werden. Dies ist wichtig, um Abstürze und andere Fehler an verschiedenen Stellen sowohl in Debug- als auch in Release-Builds zu vermeiden.

miyalys
quelle
3
Aus Gründen der Übersichtlichkeit kein Problem mit FireFox oder IE 11
Dave
6
Wenn man bedenkt, dass Opera auf der Chrome-Engine basiert, ist es nicht schockierend, dass sie auch abstürzt. Das ist der Grund, warum es gut ist, mehrere Rendering-Engines zu haben.
Ramhound
8
Aber warum passiert es beim Schweben ? Ich meine, wenn ich über einem Link schwebe, gibt es keine Suche. Warum stürzt er ab?
LINQ,
4
Es ist noch nicht klar, woran der Fehler liegt, aber manche meinen, er hängt mit dem zusammen URL canonicalizer, der anscheinend startet, sobald Sie mit der Maus über einen Link fahren, möglicherweise, um den Link in der Statusleiste des Browsers anzuzeigen. Ich kann Ihnen keine bestimmte Antwort geben, aber wenn eine URL in HTML geschrieben ist, kann sie in einer Form wie /homeoder geschrieben sein ../../home, aber Browser müssen diese URL auch in etwas mit einem Protokoll und einer Domäne wie http://superuser.com/homeso übersetzen Vielleicht stürzt die Funktionsbehandlung ab, weil unerwartete Eingaben eingehen.
Miyalys
15
@ JéfersonBueno Wenn Sie den Mauszeiger über einen Link bewegen, wird dieser in Chrome in der unteren linken Ecke angezeigt. Dies erfordert einige Verarbeitungsschritte, einschließlich der "Übersetzung" speziell codierter Zeichen. Diese Verarbeitung ist fehlerhaft und führt zum Absturz des gesamten Programms.
Fabio sagt Reinstate Monica
11

Wie Fabio Turati sagt,

Wenn Sie den Mauszeiger über einen Link bewegen, wird dieser in Chrome in der unteren linken Ecke angezeigt. Dies erfordert einige Verarbeitungsschritte, einschließlich der "Übersetzung" speziell codierter Zeichen.

Aufgrund Ihres Posts und Kommentars sind Sie jedoch eher besorgt darüber, ob Chrome eine Verbindung zum Link im Hintergrund herstellt. Dies gilt auch für andere moderne Browser ( Firefox , Opera ). Sie können das Prefetching in den Chrome- Einstellungen deaktivieren oder uBlock Origin installieren , um weitere Datenschutzeinstellungen zu erhalten.

jingyu9575
quelle
6

Ich wollte noch etwas näher erläutern, was genau hier passiert.

Grundsätzlich ist% 30 eine URL-codierte 0 und% 00 eine URL-codierte NULL (die binär als 0000 0000 angezeigt wird). Wenn Sie also eine URL mit einem verschachtelten codierten Zeichen haben, das zu NULL decodiert wird, tritt der Fehler auf.

Chrome führt beim Kanonisieren einer URL folgende Aktionen aus (Quelle: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • Eine Eingabezeichenfolge "http: //a.com/%%30%30" wird nicht in " http://a.com/%00 " umgewandelt und als gültige GURL betrachtet.
  • Diese GURL wird schließlich an GURLToDatabaseURL () gesendet, die ReplaceComponents () aufruft, um den Benutzernamen und das Kennwort zu entfernen.
  • ReplaceComponents () kanonisiert die URL neu.
  • Die Kanonisierung des Pfads trifft auf die "% 00" -Sequenz zu, blendet ein, stellt fest, dass es sich um ein 0-Zeichen handelt, das in URLs ungültig ist, lässt es maskiert, markiert aber die resultierende URL als ungültig.
  • Sobald wir zu GURLToDatabaseURL () zurückkehren, ruft es .spec () für die neue URL auf und erwartet, dass sie gültig ist, da die Eingabe-URL garantiert gültig war und wir lediglich den Benutzernamen und das Passwort entfernt haben. Dieses DCHECKs.

Die URL wird zuerst als gültig betrachtet, aber nach dem Entfernen bestimmter privater Daten wird sie ungültig. Nachdem diese Daten entfernt wurden, erwartet die Funktion, die diesen bestimmten Code aufgerufen hat, eine gültige URL.

Ein Grund dafür, dass diese URL als ungültig angesehen wird, ist, dass in einer Reihe älterer Software und Sprachen NULL verwendet wird, um das Ende einer Zeichenfolge anzugeben (da es sich im Grunde um 8 Nullen in einer Zeile handelt, was für einen Computer leicht zu erkennen ist).

Nzall
quelle