IEのMIMEタイプ取扱い方法の変更

IEBlogの「MIME-Handling Changes in Internet Explorer」を読みました。

IEMIMEタイプ(Content-Type)の扱いについて、10月のアップデートで変わった点と、IE9で変わる点について解説されています。

ブラウザがLINK要素やSCRIPT要素を content-type を無視して読み込んでしまうと、CSRF脆弱性につながるそうです。
悪意のあるページのLINKタグがほかのサイトのHTMLを指していて、それをブラウザが読み込むとします。すると、それはそのページのスクリプトから読み取ることができます。

その「ほかのサイトのHTML」がユーザがログイン状態のページだったとしたらまずいことになります。Googleのトップページとかだったら私のGoogleアカウントがばれますし、Amazonなら本名や趣味までばれてしまう、という話なんだと思います。

それで、IEは10月の累積的アップデートでこの振る舞いを変更したのだそうです。
別サイトから読み込むスタイルシートは「Content-Type: text/css」でなければブロックするようになりました。
今までそんな脆弱性があったことが驚きではありますが。
私はFireFoxでNoScriptを使っているから大丈夫だったに違いない。

IE9からはさらに、

  1. text/cssでないスタイルシートは同じサイトのものであっても無視する。
  2. SCRIPT要素の応答にサーバが「X-Content-Type-Options: nosniff」ヘッダをつけた場合、正しいMIMEタイプでなければスクリプトをロードしない*1
    JSONPを使っているサイトは、MIMEタイプをちゃんと設定しないとうまく動かなくなるとのこと。
  3. text/plainで配信された文書はPlain textとしてレンダリングする。
    これによってScript injection attackを受けにくくなると言っています。

IE9はより安全になるけど、Content-Typeはちゃんと指定してないと正しく動かなくなりますよ、というお話でした。こっち系の話はあまり詳しくないので勉強しないといけませんね。

*1:「X-Content-Type-Options: nosniff」というのは、IEMIMEタイプを判断するためにファイルの中身を見ないようにするために指定です。たとえば、IEはファイルの中身を調べて、それがHTMLっぽければContent-Typeがtext/plainであってもHTMLとしてレンダリングします。
このファイルの中身を調べる機能をMIME-sniffingと言うそうです。
そのMIME-sniffingを無効にするのがこのnosniffです。