XSSを防ぐ切り札!Content Security PolicyでWebアプリを強化
Webアプリケーションのセキュリティにおいて、XSS(クロスサイトスクリプティング)は依然として深刻な脅威です。本記事では、XSS攻撃からWebサイトを守るための強力なセキュリティメカニズム、Content Security Policy(CSP)について、その基本から実践的な導入方法、そして運用上のベストプラクティスまでを詳しく解説します。
Webアプリケーションのセキュリティにおいて、XSS(クロスサイトスクリプティング)は依然として深刻な脅威です。ユーザーからの入力が適切に処理されずにブラウザで実行されてしまうことで、セッションハイジャック、個人情報の窃取、Webサイトの改ざんなど、重大な被害を引き起こす可能性があります。 そこで注目されるのが、Webコンテンツに対するセキュリティポリシーを定義し、ブラウザに強制させることでXSSなどの攻撃を未然に防ぐ「Content Security Policy(CSP)」です。CSPは、Webサイトが読み込むリソース(スクリプト、スタイルシート、画像など)のソースを制限することで、悪意のあるコードの実行を防ぐ最終防衛線となり得ます。
XSS(クロスサイトスクリプティング)とは? その脅威を理解する
XSSは、攻撃者がWebアプリケーションの脆弱性を利用し、悪意のあるスクリプトをWebページに注入することで、そのページを閲覧したユーザーのブラウザ上で不正なコードを実行させる攻撃です。これにより、以下のような被害が発生する可能性があります。
- ユーザーのセッションクッキーを窃取し、成りすましを行う
- ウェブページの内容を改ざんし、フィッシングサイトへ誘導する
- ユーザーの個人情報を不正に取得する
- ブラウザ上で悪意のあるプログラムをダウンロードさせる
XSSには主に3つのタイプがあります。
- Stored XSS(格納型XSS): 攻撃スクリプトがWebサーバーに保存され、ユーザーがそのコンテンツを閲覧する際に実行されます。
- Reflected XSS(反射型XSS): ユーザーからの入力がそのままWebページに反射され、スクリプトとして実行されます。メールやSNSでのURL共有を通じて広がるケースが多いです。
- DOM-based XSS: WebページのDOM(Document Object Model)の操作に脆弱性があり、サーバー側の処理を経由せずにクライアントサイドでスクリプトが実行されます。
Content Security Policy (CSP) とは? Webセキュリティの新常識
Content Security Policy(CSP)は、ウェブサイトのコンテンツのロード元を制限することで、クロスサイトスクリプティング(XSS)やその他のコンテンツインジェクション攻撃を防ぐためのHTTPレスポンスヘッダーです。ブラウザはCSPヘッダーを受け取ると、そのポリシーに従ってリソースの読み込みやスクリプトの実行を制限します。 従来のXSS対策は、主にサーバーサイドでの入力検証や出力エスケープに依存していました。しかし、これらの対策は開発者の実装ミスや新しい攻撃手法に対しては限界がありました。CSPは、ブラウザ側でセキュリティポリシーを強制することで、これらの対策を補完し、多層防御の最終的な砦となります。
CSPの主要ディレクティブと設定例
CSPは、様々なディレクティブ(指示)を組み合わせてポリシーを定義します。以下に主要なディレクティブとその説明、そして設定例を示します。
| ディレクティブ | 説明 |
|---|---|
default-src | すべてのタイプのリソースのデフォルトソースを定義します。他のディレクティブで明示的に指定されない場合に適用されます。 |
script-src | JavaScriptのソースを制限します。 |
style-src | CSSスタイルシートのソースを制限します。 |
img-src | 画像のソースを制限します。 |
connect-src | XMLHttpRequest、WebSocket、EventSourceなどの接続を制限します。 |
frame-src | <frame>、<iframe>、<frameset>、<embed>、<object> のソースを制限します。 |
object-src | <object>、<embed>、<applet> のソースを制限します。 |
font-src | ウェブフォントのソースを制限します。 |
media-src | <audio>、<video> のソースを制限します。 |
manifest-src | ウェブアプリケーションマニフェストのソースを制限します。 |
worker-src | Worker、SharedWorker、ServiceWorker スクリプトのソースを制限します。 |
base-uri | <base> 要素で指定できるURLを制限します。 |
form-action | <form> のアクションURLを制限します。 |
frame-ancestors | 現在のページを埋め込むことができる親フレームを制限します(X-Frame-Options の代替)。 |
report-uri / report-to | ポリシー違反が発生した場合にブラウザがレポートを送信するURIを指定します。 |
以下は、一般的なCSPヘッダーの例です。
まとめ
Content Security Policy(CSP)は、XSS攻撃からWebアプリケーションを保護するための強力なセキュリティメカニズムです。default-srcなどのディレクティブを用いてリソースのロード元を制限し、nonceやhashを活用することでインラインスクリプトの安全な実行を可能にします。CSPは単独の対策ではなく、入力検証や出力エスケープといった基本的なXSS対策と組み合わせることで、Webセキュリティの多層防御を強化する最終防衛線として機能します。Report-Onlyモードでのテストやレポート機能の活用を通じて、継続的なセキュリティ改善を行いましょう。