ひとことで言うと
`X-Content-Type-Options: nosniff` とは、ブラウザに「サーバーが指定したMIMEタイプ以外でコンテンツを解釈するな」と命令するHTTPレスポンスヘッダーです。サーバーが `Content-Type: text/plain` を返しているファイルを、ブラウザが内容を見て「これはJavaScriptだ」と判断して実行する「MIMEスニッフィング」を禁止します。
nosniff がなければ、悪意あるユーザーが画像としてアップロードしたファイルの中にJavaScriptを隠し、ブラウザが「実はスクリプトだ」と判断して実行してしまう攻撃(コンテンツスニッフィング攻撃)が成立し得ます。共有サービスでこのヘッダーが設定されていることは、アップロードされたファイルを安全に扱う上での基本的な対策です。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
HTML共有で関係する場面
共有サービスが `X-Content-Type-Options: nosniff` を設定している場合、アップロードしたファイルのMIMEタイプが正しくないと、ブラウザはスニッフィングで補ってくれません。例えばCSSファイルが `text/plain` で配信されているとき、nosniff なし環境ではブラウザがスタイルシートとして読み込んでくれる場合もありますが、nosniff ありではブロックされ、ページのレイアウトが崩れます。
AI生成サイトを独自ドメインで公開する場合、Cloudflare や Netlify などのサービスはデフォルトで nosniff を付けています。このためローカルで問題なかったのに本番でCSSやJSが効かないという現象が起きたら、MIMEタイプの設定漏れとnosniffの組み合わせを疑ってください。開発者ツールのネットワークタブで各ファイルのContent-Typeヘッダーを確認するのが最短の切り分け方法です。
よくある誤解
「nosniff を付けるとセキュリティが上がるので全ファイルに付ければいい」という考えは正しいですが、MIMEタイプの設定が正確でない場合は表示トラブルの原因になります。nosniff は「サーバーのMIMEタイプ設定を正しくする」という前提の上で機能するセキュリティヘッダーです。MIMEタイプが間違ったまま nosniff だけ追加しても、セキュリティは高まるものの表示が壊れる可能性があります。
「nosniff はHTMLファイルにも必要」という話は誤解を招きやすいです。HTMLファイル自体は `text/html` で配信されれば問題ありませんが、HTMLが参照するCSS・JS・画像などに対して正しいMIMEタイプと nosniff が設定されていることが重要です。HTMLファイル単体への設定よりも、サイト全体の配信設定として適用することが目的です。
安全に使うための注意点
共有サービスが nosniff を設定しているかどうかは、ブラウザの開発者ツールで共有URLを開き、ネットワークタブのレスポンスヘッダーに `X-Content-Type-Options: nosniff` が含まれているかで確認できます。このヘッダーがある場合、アップロードするファイルのMIMEタイプが正しく設定されることが必須条件になります。
AI生成HTMLをZIPで一括アップロードするケースでは、サービスが各ファイルのMIMEタイプをどのように決定するかを事前に確認してください。ファイル拡張子から自動判定するサービスが多いですが、標準的でない拡張子や設定ミスでMIMEタイプが `application/octet-stream` になっていると、nosniff 環境では動作しません。不明な場合はHTMLシングルファイルに資産を埋め込んだ形式で共有する方法を選択するのが安全です。
よくある質問
nosniff が設定された共有サービスでCSSが読み込まれません。どう修正しますか?
サービスがCSSファイルに text/css 以外のMIMEタイプを返しているのが原因です。サービスの設定でMIMEタイプを変更できない場合、CSSの内容をHTMLの style タグ内にインライン化する方法で回避できます。
X-Content-Type-Options は nosniff 以外の値を取ることがありますか?
現在の仕様では nosniff のみが有効な値です。他の値は無効として扱われます。このヘッダーを設定する場合は常に nosniff を指定してください。
AI生成ページの画像が nosniff 環境で表示されません。原因は?
画像ファイルに image/png や image/jpeg ではなく application/octet-stream が付いている可能性があります。共有サービスの管理画面か設定ファイルで画像ファイルのMIMEタイプを正しく指定してください。指定できない場合は、画像をBase64でHTMLに埋め込む方法を検討してください。