草案
このページは完成していません。
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 アドオン も便利です。