Google Chromeでこのリンク(http://a//%%30%30
)をクリックすると、Chromeが壊れてすべてのタブやインスタンスを閉じてしまいます
しかし、リンク先にカーソルを合わせるだけでタブがクラッシュするケースもあります
このリンクにカーソルを合わせるとどうなるの?というか、リンクにカーソルを合わせるとChromeはどうなるの?
40 LINQ 2015-09-24
このクラッシュは、Chrome やその他の WebKit ブラウザ(!)* で最近発見されたバグによるもので、特に URL の一部に %%30%30
, %0%30
, %%300
が含まれていることに関連しています。このバグについては、こちらをご覧ください
ほとんどのリンクに影響を与えるバグではないので、一般的にはリンクの上にホバリングしても気にする必要はありません
注意事項。 * その他のWebKitブラウザには、Safari、Opera、Steam Browser、Midori、S60 (Symbian)、Blackberry Browser、Playstation 3のブラウザがありますが、Firefox、Internet Explorer、Edgeは含まれていません
編集: このバグは現在、Chrome 45.0.2454.101で修正されています
何が起こるかについての詳細
この問題は URL canonicalizer に関連しており、リンクの上にカーソルを置くとすぐに実行されます – おそらくブラウザのステータスバーにリンクを表示するためと、prefetching ウェブページがクリックされると読み込みが速くなるようにするためです
URLのcanonicalizerの役割について。 URLがHTML
で書かれている場合、/home
や../../home
のような形式で書かれているかもしれませんが、ブラウザはこのURLをhttp://superuser.com/home
のようにプロトコルとドメインを持つものに翻訳する必要があります。さらに、URL は URL エスケープ を含んでいる可能性があり、これらのエスケープは %%30%30
のようにパーセントエンコードされています。(URLエスケープのより網羅的なリストはhere)。 このURL変換を扱う機能は、開発者が期待していなかった入力を受け取るためにクラッシュしてしまうのです
URL パス内の問題のあるネストされたエスケープを正しく処理します
具体的には、入力のエスケープを解除すると、出力 URL に新しいエスケープされたシーケンスが含まれる場合、例えば、入力 “%%30%30%30” を “%00” に変換する場合、最初の ‘%’ を “%25” としてエスケープして、出力シーケンスが新しい有効なエスケープ・シーケンスとして扱われないようにします
これは、デバッグビルドとリリースビルドの両方で、クラッシュやその他のバグを回避するために重要です
42 miyalys 2015-09-24
ファビオ・トゥラーティが言うように
リンクにカーソルを合わせると、Chromeでは左下にリンクが表示されます。そのため、特別にエンコードされた文字の「翻訳」などの処理が必要になります
しかし、あなたの投稿とコメントから、私はあなたがChromeがバックグラウンドでリンクに接続するかどうかをより気にしていると思います。それはそうです、他の最新ブラウザ(Firefox, Opera)もそうです。Chrome の環境設定でプリフェッチを無効にするか、uBlock Originをインストールして、より多くのプライバシー設定を取得するとよいでしょう
11 jingyu9575 2015-09-25
ここで具体的に何が起こるのか、もう少し明確にしておきたいと思いました
基本的に、%30はURLエンコードされた0、%00はURLエンコードされたNULL(バイナリでは0000 0000と表示されます)です。そのため、NULLにデコードするような入れ子になったエンコードされた文字を持つURLを持っているとバグが発生します
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” シーケンスにヒットし、エスケープを解除し、これが URL で無効な 0 文字であることを認識し、エスケープされたままにしますが、結果として得られる URL を無効とマークします
- GURLToDatabaseURL() に戻ると、新しい URL で .spec() を呼び出します。このDCHECKs
そのため、URLは最初は有効とみなされますが、特定のプライベートデータを削除した後は無効になります。しかし、そのデータが削除された後、その特定のコードを呼び出した関数は有効な URL を期待します
このURLが無効とされる理由の一部は、古いソフトウェアや言語の多くでNULLが文字列の終わりを示すのに使われているからです(基本的には8つのゼロが並んでいるので、コンピュータでは簡単に検出できます)
6 Nzall 2015-09-25