Security

CSP Level 3 で Strict CSP を利用する

投稿日:2021年2月16日 更新日:

1. はじめに

Content Security Policy Level 3 を利用する場合に、Strict CSP というアプローチがあるのですが、このアプローチを適用したページを作成しました。

この Strict CSP というアプローチについて説明します。

2. Strict CSP の考え方

  • CSP Level 2 の時のように「ドメインをホワイトリストに追加していく」のではなく、すべての<script> タグに nonce 属性を追加し、nonce に対して許可を行う「nonce ベース」のアプローチである。更に 'strict-dynamic' を指定することで、すでに許可したスクリプトが動的に他のスクリプトを読み込むことを許可する。
  • 基本的に、script に対してのみ制御を行う(CSS や画像などは効果が薄いため)。
  • モダンブラウザでは CSP を利用した制限をかけるが、CSP Level 3 をサポートしていないレガシーなブラウザではリソースの動作を妨げないことを優先する。

3. Strict CSP を適用するための準備

  • すべての <script> タグに、nonce 属性を付ける。
    • リクエストがある毎に、サーバーサイドで nonce 値を 1つ生成し、すべての <script> タグの nonce 属性にセットする。
  • イベントハンドラ属性や javascript: に書いた JavaScript コードがあれば、リファクタリングして他の場所に移動させる。
  • ページロード毎に nonce 値を生成して、すべての nonce 属性にセットする。
  • はじめは、Content-Security-Policy ではなく Content-Security-Policy-Report-Only を利用して要素を見る。

4. デモページで出力しているCSP用のHTTPヘッダ

Content-Security-Policy:
  object-src 'none';
  script-src 'nonce-{random}' 'unsafe-inline' 'strict-dynamic' https: http:;
  base-uri   'none';
  report-uri https://misc.laboradian.com/
  • CSSや画像などに対しては何も設定しない(効果が薄いため)。
  • {random} の部分は、生成した nonce 値がセットされます。
  • eval() を許可したい場合は、'unsafe-inline' の後ろに 'unsafe-eval' を追記する。
各設定についての説明
ソース 意味
object-src 'none'
  • <object>, <embed>, <applet> タグで埋め込まれたリソースを実行しない。
script-src nonce-{random} 'unsafe-inline'
  • 'nonce-{random}' がある場合、最新のブラウザでは unsafe-inline ディレクティブは無視される。nonce をサポートしていない古いブラウザでは、 unsafe-inline が表示され、インラインスクリプトを実行できるようになる。
script-src 'strict-dynamic' https: http:
  • 'strict-dynamic' は、nonce などで許可されたスクリプトが他のスクリプみ込むことを許可する。
  • 'strict-dynamic' がある場合、
    • 最新のブラウザでは、https:http: のホワイトリストエントリは無視される。
    • 古いブラウザでは、任意の URL からのスクリプトの読み込みを許可する。
'unsafe-eval'
  • eval() などの実行を許可する。
base-uri 'none'
  • <base> URI を無効にして、相対 URL から読み込まれたスクリプトを変更されるのを防ぐ。
  • <base> タグを使っている場合は、base-uri 'self' でもよい(通常は安全なはず)。
report-uri
  • ポリシーへの違反が発生すると、指定された URL に報告される。
  • JSON形式のデータがPOSTメソッドによるリクエストで送信される。
ブラウザ毎の動作
ブラウザの種類 動作
最新のブラウザ
  • nonce 属性がポリシーヘッダに設定された値と一致するスクリプトと、適once を持つスクリプトによってページに動的に追加されたスクリプトのみを実行する。
CSP3 標準をサポートしていない古いブラウザ
  • nonce-*'strict-dynamic' キーワードを無視して [] にフォールバックする。
  • XSS 脆弱性に対する保護よりも、アプリケーションが動作することを優先する。
DevTools でレスポンスヘッダを見る
DevTools でレスポンスヘッダを見る

5. 観察する

ブラウザでデモページのソースを開き、何回かリロードしてください。nonce 値が毎回変更されるのが分かります。

ブラウザの開発者ツールの Console パネルを見ます。CSP のエラーは発生していないはずです。

6. 参考

Web Security

CSP (Contents Security Policy) の記述例その2

2021.02.16
Web Security

CSP (Contents Security Policy) の記述例

2015.04.18

📂-Security

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Webのセキュリティに役立つWebサービス

目次1. 特定のホスト(サーバー)について調査する2. あるウェブページが安全であるかチェックする3. 特定のWebサイトのSSL設定をチェックする4. 短縮URLの元のURLを取得する5. その他 …

no image

メールヘッダ・インジェクション by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構、「メールヘッダ・インジェクション」から一部抜粋する。(この資料はPDFでしか提供されていない) 目次注意が必要なウェブサイト …

no image

ウェブサイトの安全性向上のための取り組み – フィッシング詐欺を助長しないための対策 by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「フィッシング詐欺を助長しないための対策」の項目から一部抜粋する。(この資料はPDFでしか提供されていない) フィッシング詐欺 …

no image

セッション管理の不備 by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「セッション管理の不備」から一部抜粋する。(この資料はPDFでしか提供されていない) 目次セッションIDの推測セッションIDの盗用 …

no image

バッファオーバーフロー by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「バッファオーバーフロー 」から一部抜粋する。(この資料はPDFでしか提供されていない) 目次注意が必要なウェブサイトの特 …