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

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

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

Web Security

JVN iPediaに載っていた脆弱性を調査する

JVN iPedia という脆弱性対策情報データベースの Webサイトがあるのですが、そこに載っていた JVNDB-2016-005868 という脆弱性情報について調査する過程を紹介します。 調査 ま …

Web Security

WebサイトのHTTPS(SSL)化には Upgrade-Insecure-Requests を使いましょう

目次はじめに原理方法1方法2方法1の設定方法Apacheでの設定Nginx での設定ブラウザの対応状況参考 はじめに せっかくSSLサーバー証明書をとって、Webサイトを SSL化したのに、コンテンツ …

no image

OS コマンド・インジェクション by IPA「安全なウェブサイトの作り方 第7版」

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

no image

クリックジャッキング(Clickjacking)対策

対策 方法1:CSP(Content Security Policy) の frame-ancestors ディレクティブを使う。 方法2:HTTP レスポンスヘッダに、X-Frame-Options …