水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > meta refreshの解釈の差異によって発生する問題

meta refreshの解釈の差異によって発生する問題

2012年3月1日(木曜日)

meta refreshの解釈の差異によって発生する問題

更新: 2012年3月12日15時10分頃

このお話は興味深いですね……「Googleのmetaリダイレクトに存在した問題 (masatokinugawa.l0.cm)」。

meta refreshのcontent属性の中身を動的生成している場合、ここに外部から値を入れられるとき、リダイレクト先を変更できてしまう場合があるという話です。

Internet Explorer 6/7では、以下のようなmetaタグの指定で、http://evil/へリダイレクトします。

<meta http-equiv="refresh" content="0;url='http://good/'url='http://evil/'">

ちなみにHTML5では、ご丁寧にmeta refreshのcontent属性のパース方法が決められていて、「4.2.5.3 Pragma directives - Refresh state (www.w3.org)」に細かく書かれています。

url=の後ろの値の読み取り部分だけを見ると、以下のような感じになります。

20. の処理でquote文字列の後ろはすべて切り落とされることになっているので、問題のケースでは http://good/ がURLとみなされるのが正しいです。IE6/7の処理はHTML5の仕様とは異なっています。

とはいえ、そういう残念な処理をするブラウザが存在するというのは事実なので、注意が必要になるということですね。

以下も似たような話です。

こちらも、IE6/7の解釈がHTML5仕様と異なっているという問題です。HTML5の仕様上は、;url= は単にURLの一部とみなされるのですが、IE6/7はそうは解釈しないということですね。

ちなみに、content属性の値はまずHTMLの属性として解釈されるので、数値文字参照や名前つき文字参照は、url=を解釈する前の時点で展開されています。つまり、URL中の単引用符を &#39; や &#x27; と書いてエスケープしようと思っても無駄です。

%27にエスケープするなら意味がありますが、URIの意味が変わってくる場合があります。' はRFC3986で sub-delims に含まれている文字なので、生でURIの中に出現することがあり得ます。

※2012-03-12追記: 上記部分部分、生「'」は普通出現しないと書いていましたが、ご指摘を受けて訂正しました。ありがとうございます。

そんなわけで、レガシーなブラウザを考慮するとmeta refreshの動的生成は注意が必要、という話ではあります。

※しかし、そもそもmeta refreshなどというものを使う必要があるのでしょうか。時間指定のリダイレクトにはアクセシビリティ上の問題がありますし、「ページの自動読み込み」を無効にしたIEなどではmeta refreshは全く機能しないわけですから、必ず代替手段を用意しておく必要がありますし。

関連する話題: セキュリティ / プログラミング / HTML / Internet Explorer

人気のページ

最近の日記

関わった本など

デザイニングWebアクセシビリティ - アクセシブルな設計やコンテンツ制作のアプローチコーディングWebアクセシビリティ - WAI-ARIAで実現するマルチデバイス環境のWebアプリケーション体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践ウェブの仕事力が上がる標準ガイドブック 5 WebプログラミングWeb Site Expert #13Dreamweaver プロフェッショナル・スタイル [CS3対応] (Style for professional)

その他サイト