補足編:機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき

機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記」の補足編です。

結局、よくわからないんだけど。
よくわからない場合は、とにかく全てのレスポンスに X-Content-Type-Options: nosniff をつけましょう。
機密情報を含むJSONにX-Content-Type-Options:nosniffをつける理由はわかったけど、「あらゆる」コンテンツにつける理由はなぜ?
機密情報を含まなくても、<script>のような文字列を含むコンテンツをIEで直接開いた場合にはXSSにつながる可能性もあります。どのようなコンテンツにX-Content-Type-Options:nosniffが必要かを考えるくらいであれば、全てのコンテンツに付与したほうが間違いがなくていいでしょう、ということです。
IEのためだけの問題でしょ。IEが対応しろよ。
確かに現在明確に問題があるのはInternet Explorerだけですが、「機密情報を含むコンテンツをスクリプトなどのリソースとして読み込み、その機密情報に攻撃者がアクセス可能になる」という種類の脆弱性はこれまでにもIE以外にもたびたび発見されています。また、現在X-Content-Type-OptionsレスポンスヘッダによるContent-Typeの厳格化はIE以外のブラウザにも導入される動きがあります(Heads up: nosniff header support coming to Chrome and Firefox · GitHub:)。そのような状況を考えると、X-Content-Type-Options:nosniffを付与することでコンテンツ内の機密情報の盗み見を防ぐということは、IE以外のブラウザに対しても現在発見されていない脆弱性・攻撃手法を防ぐという点で備えとして十分意義のあるものだと言えます。
XMLHttpRequestからリクエスト発行時に X-Request-With のようなカスタムヘッダを付与する方法で防げるのでは?
はい。PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)〜JSON等の想定外読み出しによる攻撃〜 - ockeghem(徳丸浩)の日記 に示されるような方法で、XMLHttpRequest からJSONを取得するリクエスト発行時に xhr.setRequestHeader( "X-Request-With", "XMLHttpRequest" ); のようにカスタムのリクエストヘッダを付与し、JSONを提供するサーバ側ではそのヘッダの有無を確認するという方法で、リクエストをXMLHttpRequestからのみに制限し<script>要素による読み込みを防ぐことができます。JSON提供側がXMLHttpRequestからのみを想定している場合に、実際にXMLHttpRequestにのみ応答を制限するという方法は、今回の攻撃に限らず様々なAjaxレスポンスを利用した攻撃に対しても有用な対策方法となりますので、ぜひそうすべきです。
CSRFトークンがついていれば防げるのでは?
はい。JSONのリクエストに攻撃者の知りえないCSRFトークンが必要ということであれば、<script>要素として読み込むことはできないため、今回示したような攻撃は防ぐことができます。ただし、一般的にはCSRFとはリクエストが発行された時点でのサーバ側での副作用を狙った攻撃のためGETではなくPOSTになることがほとんどで、JSONの発行がPOSTのみに制約されている場合にはそもそも<script>要素でJSONを読み込むことはできません。