Content Security Policy の利用方法

草案
このページは完成していません。

Content Security Policy の設定とは、Web ページに対する Content-Security-Policy HTTP ヘッダの付加、またそのページ上でユーザエージェントが読み込むリソースを制限する値の設定に他なりません。例で説明すると、画像をアップロードして表示するページならば、画像については任意の場所を許可することになりますが、フォームの送信元は制限する必要があるでしょう。Content Security Policy を適切に設定すれば、クロスサイトスクリプティング攻撃に対するサイトの耐性が向上させることが可能です。この記事では、適切なヘッダの設定方法を例とともに説明します。

Firefox 23 より前は X-Content-Security-Policy HTTP ヘッダが使用されていました。Firefox 23 以降は、標準化が行われた Content-Security-Policy ヘッダを使用します。以前のヘッダから新しいヘッダへ移行する間は、Web サイトから X-Content-Security-Policy ヘッダと Content-Security-Policy ヘッダの両方を送信してもかまいません。この場合は X-Content-Security-Policy が無視され、Content-Security-Policy ヘッダに含まれているポリシーが適用されます。

ポリシーの指定

ポリシーを指定するには、次のように Content-Security-Policy HTTP ヘッダを使用してください。

Content-Security-Policy: policy

policy には Content Security Policy を記述する ポリシーディレクティブ からなる文字列が入ります。

ポリシーの記述

ポリシーは ポリシーディレクティブ を列挙して記述します。各ディレクティブには、特定のリソースの種類やポリシーエリアに関するポリシーを記述します。ポリシーには少なくとも default-src ポリシーディレクティブが含まれなければなりません。この default-src ディレクティブは、明確なポリシーを持たない任意のリソースを意図したフォールバックの働きをします(すべての一覧は default-src ディレクティブの説明 を参照してください)。CSP でインラインスクリプトの実行を制限したり eval() の使用をブロックしたりするには、ポリシーに default-src ディレクティブまたは script-src ディレクティブを含めることが必要です。<style> 要素や .style 属性によって適用されるインラインスタイルを CSP で制限するには、ポリシーに default-src ディレクティブまたは style-src ディレクティブを含めることが必要です。

ポリシーの構文は、各ディレクティブをセミコロンで区切った文字列です。各ディレクティブは、サポートされたポリシーディレクティブに書かれた構文に従います。

例: 一般的な使用例

この節では、一般的に使用されるセキュリティポリシーの例を示します。

例 1

Web サイトの管理者が、すべてのコンテンツをサイト自身のドメイン (サブドメインを除く) から読み込むようにしたい場合。

Content-Security-Policy: default-src 'self'

例 2

Web サイトの管理者が、信頼されたドメインとそのすべてのサブドメインからのコンテンツを許可したい場合。

Content-Security-Policy: default-src 'self' *.mydomain.com

例 3

Web サイトの管理者が、Web アプリケーションのユーザに、そのカスタムコンテンツに任意のドメインからの画像を含めることを許可したい場合。ただし、オーディオやビデオメディアは信頼されたプロバイダからのものだけに制限し、すべてのスクリプトは、信頼されたコードをホストする特定のサーバからのもののみに制限する。

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

この例は、デフォルトでは、ドキュメントの元のホストからのコンテンツのみが許可されますが、次の例外を伴います:

  • 画像はどこからのものでも読み込まれます (ワイルドカード記号 "*" に注意してください)。
  • メディアは、media1.com と media2.com からのものだけが許可されます (これらのサイトのサブドメインは許可されません)。
  • 実行可能なスクリプトは、userscripts.example.com からのものだけが許可されます。

例 4

オンライン銀行サイトの管理者が、データ要求時の盗聴攻撃を防ぐため、サイトのすべてのコンテンツを SSL を使用して読み込むようにしたい場合。

Content-Security-Policy: default-src https://onlinebanking.jumbobank.com

この例では、サーバは、onlinebanking.jumbobank.com からの単一のドメインで HTTPS を通して読み込まれたドキュメントへのアクセスだけを許可します。

例 5

Web メールサイトの管理者が、メール内の HTML を許可し、その画像はどこからのものでも読み込みを許可するが、JavaScript や他の潜在的に危険なコンテンツは許可したくない場合。

Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *

この例では、script-src を指定していないことに注意してください。この CSP を設定したサイトは、default-src ディレクティブによって指定された設定を使用します。つまり、スクリプトは元のサーバからのものだけを読み込むことができます。

ポリシーのテスト

ポリシーのデプロイをを容易にするため、CSP は "report-only" モード で実行することができます。このモードで実行している間にポリシーは適用されませんが、何らかの違反があった場合は指定した URI に報告されます。加えて、ポリシーをデプロイする前のテストとして report-only ヘッダを使用することもできます。

ポリシーを指定するには、次のように Content-Security-Policy-Report-Only HTTP ヘッダを使用してください:

Content-Security-Policy-Report-Only: policy

Content-Security-Policy-Report-Only ヘッダと Content-Security-Policy ヘッダの両方が同じレスポンス内にあった場合、両方のポリシーが尊重されます。Content-Security-Policy ヘッダで指定されたポリシーは、Content-Security-Policy-Report-Only のポリシーがレポートを生成している間に実施されますが、Content-Security-Policy-Report-Only のポリシーは実施されません。

X-Content-Security-Policy-Report-Only ヘッダは Firefox 23 より前で使用されていたことに注意してください。X-Content-Security-Policy-Report-Only ヘッダと Content-Security-Policy-Report-Only ヘッダの両方を送信した場合は、Content-Security-Policy-Report-Only が適用され、X-Content-Security-Policy-Report-Only は無視されます。

Web サイトに対する Content Security Policy の設定・テストには UserCSP アドオン も便利です。

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: hashedhyphen, hamasaki, yyss, Marsf
 最終更新者: hashedhyphen,