X-Content-Type-Optionsとは
X-Content-Type-Optionsは、ブラウザに「サーバーが示した Content-Type を信用し、ファイルの中身から種類を推測しない」よう指示するHTTPヘッダーです。指定できる値は nosniff だけです。
X-Content-Type-Optionsが必要な理由
ブラウザは、Content-Type が不正確なファイルを、中身から種類を推測して扱うことがあります。これをMIMEスニッフィングと呼びます。
会員がファイルをアップロードできるサイトで、攻撃者がHTMLやスクリプトを含むファイルを画像やテキストのふりをして置くと、ブラウザが推測してHTMLとして実行し、XSSになる場合があります。nosniff があれば、text/plain として返されたファイルは、HTMLとして扱われません。
X-Content-Type-Optionsの仕組み
| 読み込みの種類 | nosniff があるときの動き |
|---|---|
| scriptとして読み込むファイル | JavaScriptのMIMEタイプでなければ実行しない |
| CSSとして読み込むファイル | text/css でなければ適用しない |
| それ以外 | 種類を推測せず、示された Content-Type のとおりに扱う |
X-Content-Type-Optionsの確認方法
開発者ツールの「ネットワーク」タブで、レスポンスヘッダーに x-content-type-options: nosniff があるかを見ます。コマンドでは次のとおりです。
curl -s -D - -o /dev/null https://example.com/ | grep -i '^x-content-type-options'
画像やCSSなど、サイト内のファイルの Content-Type が正しいかも、同じコマンドの grep を '^content-type' に変えて確かめられます。
X-Content-Type-Optionsの設定例
Apache(.htaccess)の例です。
Header always set X-Content-Type-Options "nosniff"
nginxの例です。
add_header X-Content-Type-Options "nosniff" always;
WordPress(子テーマのfunctions.php)の例です。
add_action('send_headers', function () {
header('X-Content-Type-Options: nosniff');
});
よくある間違いと注意点
- 値は
nosniffだけです。no-sniffのような綴りの違いや、別の値は認識されません。 - 設定後に、スクリプトやCSSが読み込まれなくなることがあります。
Content-Typeが誤っている(JavaScriptがtext/plainで返るなど)のが原因です。サーバー側の拡張子とMIMEタイプの対応を直します。 - ヘッダーを付けても、アップロードされたファイルの種類や内容の検査は不要になりません。アップロード機能では、受け付ける形式の制限を別に行います。
- エラーページや静的ファイルにも付くよう、Apacheでは
always、nginxでもalwaysを指定します。
Webサイト セキュリティチェッカーで確認する
Webサイト セキュリティチェッカーは、X-Content-Type-Optionsの nosniff が返っているかを診断します。ほかのセキュリティヘッダーの状態も、同じ結果の画面で一覧できます。
関連用語
関連する用語
サイトの設定を無料で確認する
サイトのURLを入力するだけで、X-Content-Type-Options などの設定状況を診断できます。Webサイト セキュリティチェッカー「Security Checker X」は、登録なしで使えます。









