日記
ファイルダウンロード処理時のIEの仕様に関する注意点 (13:55)Edit

昔どこかのWikiに関連ログがあったはずだけど、ググってみても見つからないんで、念のためここでまとめておこう。Wikiに添付ファイル絡みの脆弱性が発見された絡みの情報として。

IEはセキュリティ設定の「拡張子ではなく、内容によってファイルを開くこと」を無効にしておかないと(デフォルトでは有効)、content-typeや拡張子よりもファイルの内容の方を優先して処理を行う。

だから、添付ファイルなんかを出力する際に、text/plainとかapplication/octet-streamとかのcontent-typeを使っても、.txtとか.binとかの拡張子をつけても、データ自体にスクリプトが含まれていた場合は、実行されてしまう。具体的には、「テキストデータの先頭からnバイトまでの間にHTMLタグらしきものが見つかったら、HTMLとして解釈する」なんて感じの挙動。

以下のサンプルファイルをIEで開いてみれば、どうなるのかわかる。

test1シリーズは単に「<script>alert('test');</script>」ってだけの内容。IE以外のブラウザでは、.htmlの拡張子のもの以外は、スクリプトが実行されないはず。だけどIEでは、.txt(text/plain)、.bin(application/octet-stream)、.jpg(image/jpeg)という拡張子+content-typeはすべて無視されてスクリプトが実行される。

test2シリーズは、test1の内容の前に無駄なテキスト(数値)を247バイト(改行分は1バイトと数える)つけている。これでもtest1シリーズと同様にIEではスクリプトが動作する。

test3シリーズは、スクリプトの前につけるテキストのサイズを248バイトにしている。こっちはIEでもスクリプトが発動しないはず。おそらくIEは247バイトまでにHTMLタグらしきものが見つからない場合は、text/plainとして扱っているってことなんでしょう。

ただこの境界となるバイト数は、たまたま今手元で試してみた数値ってだけで、ちゃんとした根拠がある数値ではないので、あまり信頼しないで欲しい。

(※追記@2005/5/23 このバイト数に関しては、y-Akiさんのコメントをはじめとする追加情報があります)

というわけで、IEでは正しいcontent-typeをつけても拡張子をつけても、内容としてスクリプトが発動するようなデータだった場合は、スクリプトが発動してしまうので、注意が必要。

ちなみに

Content-Disposition: attachment; filename="foo.txt"

なんてヘッダを指定して、強制的にダウンロードさせる(ダウンロードダイアログを出させる)って手は使えるかもしれないけど、どうも上記指定によるダウンロードって、Windowsのシェル設定(txtのハンドラーを何にするか、とか)によって挙動が変わるっぽいんで、それほど信頼できない気がする。ってのには特に根拠はなく、前にそんなことがあった気がする、程度の情報。

Published At2005-05-20 00:00Updated At2005-05-20 00:00