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 はどうなんだろ。