Content Security Policy (CSP)

この記事は翻訳作業中です。

Content Security Policy (CSP) とは、クロスサイトスクリプティング (XSS) やデータを差し込む攻撃などといった、特定の種類の攻撃を検知し、影響を軽減するために追加できるセキュリティレイヤーです。これらの攻撃はデータの窃取からサイトの改ざん、マルウェアの拡散に至るまで、様々な目的に用いられます。

CSP は完全な後方互換性を保って設計されています(ただし、CSP 2 については後方互換性が無い点もあり、明示的に記述されています。詳細は こちら の 1.1 章を参照してください)。そのため、CSP 未対応のブラウザでも CSP 実装済のサーバと通信でき、逆もまた同様です。CSP 未対応のブラウザは単に CSP を無視し、web コンテンツにはこれまで通り標準の同一オリジンポリシーを適用します。CSP ヘッダを送信しないサーバに対しても、ブラウザは同様に標準の 同一オリジンポリシー を適用します。

CSP を有効にするには、web サーバから Content-Security-Policy HTTP ヘッダを返すように設定する必要があります(X-Content-Security-Policy ヘッダに関する記述が時々ありますが、これは古いバージョンのものであり、今日このヘッダを指定する必要はありません)。

他にも、 <meta> 要素を用いてポリシーを指定することも可能です。

脅威

クロスサイトスクリプティングの軽減

CSP の第一の目的は XSS 攻撃の軽減と報告です。XSS 攻撃とは、サーバから取得したコンテンツをブラウザが信頼する性質を悪用した攻撃です。ブラウザはコンテンツの送信元を信頼するため、たとえ実際の送信元が見かけ上とは異なっていたとしても、悪意あるスクリプトが被害者のブラウザ上で実行されてしあいます。

サーバ管理者が CSP を利用する場合、実行を許可するスクリプトの正しいドメインをブラウザに向けて指定することにより、XSS の発生する箇所を削減・根絶することができます。CSP をサポートするブラウザは、サーバから指定されたホワイトリストに載っているドメインのスクリプトのみ実行し、他のスクリプトはすべて無視します(インラインスクリプトや HTML 属性値のイベントハンドラも無視する対象に含まれます)。

究極的な防衛策として、スクリプトを決して実行させたくないサイトは、スクリプトの実行を全面的に拒否することも可能です。

パケット盗聴攻撃の軽減

取得するコンテンツのドメインを制限することに加えて、サーバは通信に使うプロトコルを指定することも可能です。例えば、(セキュリティの観点からはこれが理想的ですが)すべてのコンテンツを HTTPS で取得されるようにサーバから指定することが出来ます。データ通信におけるセキュリティ戦略を完全なものとするには、HTTPS 通信を強制するだけではなく、すべての Cookie に secure フラグ を付けたり、HTTP ページから対応する HTTPS ページへの自動リダイレクトを整備することも必要です。また、ブラウザが暗号化された通信路のみを用いてサイトに接続することを保証するため、Strict-Transport-Security HTTP ヘッダを利用することも可能です。

Using CSP

Configuring Content Security Policy involves adding the Content-Security-Policy HTTP header to a web page and giving it values to control resources the user agent is allowed to load for that page. For example, a page that uploads and displays images could allow images from anywhere, but restrict a form action to a specific endpoint. A properly designed Content Security Policy helps protect a page against a cross site scripting attack. This article explain how to construct such headers properly, and provides examples.

Specifying your policy

You can use the Content-Security-Policy HTTP header to specify your policy, like this:

Content-Security-Policy: policy

The policy is a string containing the policy directives describing your Content Security Policy.

Writing a policy

A policy is described using a series of policy directives, each of which describes the policy for a certain resource type or policy area. Your policy should include a default-src policy directive, which is a fallback for other resource types when they don't have policies of their own (for a complete list, see the description of the default-src directive). A policy needs to include a default-src or script-src directive to prevent inline scripts from running, as well as blocking the use of eval(). A policy needs to include a default-src or style-src directive to restrict inline styles from being applied from a <style> element or a style attribute.

例: 一般的な使用例

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

例 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 ディレクティブによって指定された設定を使用します。つまり、スクリプトは元のサーバからのものだけを読み込むことができます。

Testing your policy

To ease deployment, CSP can be deployed in report-only mode. The policy is not enforced, but any violations are reported to a provided URI. Additionally, a report-only header can be used to test a future revision to a policy without actually deploying it.

You can use the Content-Security-Policy-Report-Only HTTP header to specify your policy, like this:

Content-Security-Policy-Report-Only: policy 

If both a Content-Security-Policy-Report-Only header and a Content-Security-Policy header are present in the same response, both policies are honored. The policy specified in Content-Security-Policy headers is enforced while the Content-Security-Policy-Report-Only policy generates reports but is not enforced.

Browsers that support CSP always send a violation report for each attempt to violate the policy you have established if the policy contains a valid report-uri directive.

Enabling reporting

By default, violation reports aren't sent. To enable violation reporting, you need to specify the report-uri policy directive, providing at least one URI to which to deliver the reports:

Content-Security-Policy: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi

Then you need to set up your server to receive the reports; it can store or process them in whatever manner you feel is appropriate.

Violation report syntax

The report JSON object contains the following data:

document-uri
The URI of the document in which the violation occurred.
referrer
The referrer of the document in which the violation occurred.
blocked-uri
The URI of the resource that was blocked from loading by the Content Security Policy. If the blocked URI is from a different origin than the document-uri, then the blocked URI is truncated to contain just the scheme, host, and port.
violated-directive
The name of the policy section that was violated.
original-policy
The original policy as specified by the Content-Security-Policy HTTP header.

Sample violation report

Let's consider a page located at http://example.com/signup.html. It uses the following policy, disallowing everything but stylesheets from cdn.example.com.
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
The HTML of signup.html looks like this:
<!DOCTYPE html>
<html>
  <head>
    <title>Sign Up</title>
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    ... Content ...
  </body>
</html>
Can you spot the mistake? Stylesheets are only allowed to be loaded from cdn.example.com, yet the website tries to load one from its own origin (http://example.com). A browser capable of enforcing CSP will send the following violation report as a POST request to http://example.com/_/csp-reports, when the document is visited:
{
  "csp-report": {
    "document-uri": "http://example.com/signup.html",
    "referrer": "",
    "blocked-uri": "http://example.com/css/style.css",
    "violated-directive": "style-src cdn.example.com",
    "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports"
  }
}

As you can see, the report includes the full path to the violating resource in blocked-uri. This is not always the case. For example, when the signup.html would attempt to load CSS from http://anothercdn.example.com/stylesheet.css, the browser would not include the full path but only the origin (http://anothercdn.example.com). The CSP specification gives an explanation of this odd behaviour. In summary, this is done to prevent leaking sensitive information about cross-origin resources. Note, that even the specification got this part wrong in its example on violation reports (blocked-uri should be "http://evil.example.com").

ブラウザ実装状況

機能 Chrome Edge Firefox Internet Explorer Opera Safari Servo
Content-Security-Policy2511423.021031574?
Content-Security-Policy-Report-Only251423.010157?
機能 Android Chrome for Android Edge Mobile Firefox for Android IE Mobile Opera Mobile Safari Mobile
Content-Security-Policy4.4(有り)(有り)23.0??7.15
Content-Security-Policy-Report-Only4.4(有り)(有り)23.0??7.1

1. Implemented as X-Webkit-CSP header in Chrome 14.

2. Implemented as X-Content-Security-Policy header in Firefox 4.

3. Implemented as X-Content-Security-Policy header, only supporting 'sandbox' directive.

4. Implemented as X-Webkit-CSP header in Safari 6.

5. Implemented as X-Webkit-CSP header in iOS 5.1.

関連情報

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

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