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

CSRF(クロスサイト・リクエスト・フォージェリ) by IPA「安全なウェブサイトの作り方 第7版」

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

Web Security

CSP (Contents Security Policy) の記述例

目次記述例メモその他のメモ参考 記述例 デフォルト設定の記述をする(HTTPレスポンスヘッダの出力)。 同一オリジンも含めて全てのソース1からの読み込みを禁止する場合 Content-Security …

PHP

Laravel 5 でのセキュリティ対策 (PHP)

目次1. ユーザーによる入力値の検証入力パラメータ値のエンコーディングが正しいことをチェックするMiddlewareの例制御文字を禁止するバリデーションルールを追加する例1. バリデーション用のクラス …

no image

Webサイト/スマートフォンに関するセキュリティインシデント情報

目次Webサイトに関するセキュリティインシデント情報のリンクスマートフォンに関するセキュリティインシデント情報のリンクその他 Webサイトに関するセキュリティインシデント情報のリンク 2016-11- …

no image

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

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