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

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

関連記事

no image

パス名パラメータの未チェック/ディレクトリ・トラバーサル by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「パス名パラメータの未チェック/ディレクトリ・トラバーサル」から一部抜粋する。(この資料はPDFでしか提供されていない) …

Web Security

XSS Auditor が有効になっているかチェックするためのページを作りました

目次1. XSS とは?2. XSS を防ぐためのブラウザの機能「XSS Auditor」3. Webブラウザの XSS Auditor 機能が有効かどうか調べる4. 参考 1. XSS とは? XS …

no image

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

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

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

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

no image

セキュリティに関連するリンク集

情報は随時追加します。 目次毎日チェックするとよいウェブページ一般Webアプリケーション関連WordPress関連インシデント 毎日チェックするとよいウェブページ IPA 独立行政法人 情報処理推進機 …