CSP(Content Security Policy:コンテンツセキュリティポリシー)は、Webサイトに追加できるセキュリティ層であり、クロスサイトスクリプティング(XSS)やデータインジェクション攻撃などの一般的な攻撃を検出して防止するように設計されています。基本的には、Webサイトに読み込むことが許可されているスクリプト、スタイル、画像、フレームのソースを指定するホワイトリストとして機能します。これにより、明示的に指定されたリソースのみが読み込まれ、ホワイトリストにないリクエストは即座にブロックされます。CSPをサポートしていないブラウザでも、CSPを実装したサーバーと正常に動作し、その逆も同様です。ブラウザがCSPをサポートしていない場合、CSPは無視され、Webサイトはデフォルトのポリシーを適用します。
CSPは、サーバーからのレスポンスにContent-Security-Policy
HTTPヘッダーを追加することで機能します。このヘッダーには、読み込みが許可されるコンテンツの種類と、そのソースを定義するディレクティブ(指示)のセットが含まれています。たとえば、script-src
ディレクティブは、読み込みが許可されるJavaScriptファイルのソースを規定します。
CSPにはさまざまなディレクティブがあり、それぞれが特定の種類のリソースを制御します。一般的なディレクティブには、次のものがあります。
default-src
:特定のディレクティブが定義されていない場合、すべてのリソースの種類に適用されます。script-src
:JavaScriptファイルの読み込みを制御します。style-src
:CSSファイルの読み込みを制御します。img-src
:画像の読み込みを制御します。font-src
:フォントの読み込みを制御します。frame-src
:iframeの読み込みを制御します。object-src
:Flashなどの埋め込みオブジェクトの読み込みを制御します。media-src
:音声や動画などのメディアファイルの読み込みを制御します。
各ディレクティブは、1つまたは複数の値を受け取ることができます。値には、次のものがあります。
'self'
:Webサイトと同じオリジンからのリソースの読み込みを許可します。'none'
:リソースの読み込みを許可しません。'unsafe-inline'
:<script>
などのインラインコードやインラインスタイルの使用を許可します。ただし、CSPのセキュリティ効果が低下するため、この値を使用することはお勧めしません。- 特定のURL:指定されたURLからのリソースの読み込みを許可します。
- ドメイン名:指定されたドメインのすべてのサブドメインからのリソースの読み込みを許可します。たとえば、
example.com
は、www.example.com
、sub.example.com
などからのリソースの読み込みを許可します。 *
:ワイルドカード。任意のソースからのリソースの読み込みを許可します。CSPのほとんどのセキュリティ機能が無効になるため、この値を使用することはお勧めしません。data:
:データURIからのリソースの読み込みを許可します。https:
:HTTPSを使用する任意のソースからのリソースの読み込みを許可します。
シンプルなCSPの例:
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self' https://example.com;
このCSPは、以下を許可します。
- Webサイトと同じオリジンからのすべてのリソースの種類(画像とスクリプトを除く)の読み込み。
- 同じオリジンまたはデータURIからの画像の読み込み。
- 同じオリジンまたは
https://example.com
からのスクリプトの読み込み。
CSPの違反を監視するには、report-uri
またはreport-to
ディレクティブを使用できます。このディレクティブを使用すると、ブラウザはCSPの違反に関するレポートを指定されたURLに送信できます。report-uri.com
などのサービスは、これらのレポートを収集して分析するためのインターフェースを提供し、Webサイトのセキュリティ上の脆弱性をより深く理解するのに役立ちます。
CSPを適切に実装することで、XSSやインジェクション攻撃のリスクを大幅に軽減し、Webサイトとユーザーをサイバーセキュリティの脅威から保護することができます。