X-Content-Type-Options: nosniffの効果を確認してみる

以前、年明け早々くらいにTwitterのタイムライン上にX-Content-Type-Options: nosniffのことが流れていたので、その効果について確認してみました。細かいことは

をご覧ください。

例えばこんなスクリプトを用意してみます。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $q = CGI->new;

print $q->header(
          '-type' => 'text/plain',
#          '-X-Content-Type-Options' => 'nosniff',
      );
print "<script>alert('TEST')</script>";
1;

このスクリプトにとりあえずtest.cgiと名付けてブラウザからアクセスしてみるとIEではContent-typeを’text/plain’と指定していても内容からHTMLとして判断されてJavaScriptが実行されます。

では、レスポンスヘッダにX-Content-Type-Options: nosniffを追加します。前のサンプルからコメントアウトをはずしてサイドブラウザでアクセスしてみます。

こうするとIEでも他のブラウザ同様、テキストとして<script>alert(‘TEST’)</script>と表示されるようになるようです。

最初に紹介したリンク先ではXSSが発生しうるもっと現実味のあるシナリオも紹介されていますが、Webアプリの制作者として、訪問者がIEでのアクセスが考えられる以上、適切なContent-typeを指定するだけでは予測の難しいセキュリティ上のリスクを含みうるということが分かります。

ただ、IE7以前ではX-Content-Type-Options: nosniffは効かないようですが……。