理系学生日記

おまえはいつまで学生気分なのか

ファイルを直接開くのを禁止してセキュリティ向上 (X-Download-Options)

MIME-sniffing

IE には、セキュリティを劣化させるとして悪名高い MIME-sniffing という機能があって、サーバがどんなにこのファイルはテキストファイルだよ!! (content-type: text/plain) とブラウザに教えても、そのテキストファイルに HTML の要素があると HTML と解釈してしまう場合があったりします。 そして、これを防ぐには HTTP のレスポンスヘッダに X-Content-Type-Options: nosniff を付けることが定石とされています。このヘッダを加えると、IE は MIME-sniffping を実施しなくなります。

MIME-Handling

上述の MIME-sniffing は良く知られた振舞いだと思うんですが、今日ぼくが知ったのは「ブラウザで直接ファイルを開かないようにすることで、セキュリティを向上させる」という方法でした。 IE では、ファイルをローカルに(明示的に)保存することなく開くという機能があります。ダウンロードリンクをクリックすると出てくるダイアログの「開く」ボタンを押下したときに働く機能ですね。

実はこの機能でファイルを開いた場合、そのファイルの内容はダウンロード元のウェブサイトのコンテキストで実行されるらしいです。悪意のあるスクリプトなんかをこの方法で開いてしまうと、インジェクションなんかが可能になるってことですね。 これを防ぐためのレスポンスヘッダが存在していて、それが

X-Download-Options: noopen

というレスポンスヘッダです。このヘッダをレスポンスに付与しておくと、ユーザは当該のファイルを直接「開く」ことができなくなり、明示的にローカルにダウンロードする他なくなります。 ローカルにダウンロードされたファイル(悪意のあるスクリプト込み)を後で開いたところで、既にウェブサイトのコンテキストで実行されることがないので、少なくとも Web サイトに対する脅威ではなくなると。

色々なヘッダがあるものだなぁと。なお、このヘッダが効くのは IE 8 から。Edge はどうなんだろ。

参考文献