CSP: script-src

HTTP の Content-Security-Policy (CSP) の script-src ディレクティブは、 JavaScript の情報なソースを指定します。これは <script> 要素の中に直接読み込まれる URL だけでなく、インラインのスクリプトイベントハンドラー (onclick) やスクリプト実行のトリガーとなりうる XSLT スタイルシートのようなものも含まれます。

CSP バージョン 1
ディレクティブ種別 フェッチディレクティブ
default-src による代替 あり。このディレクティブがない場合、ユーザーエージェントは default-src ディレクティブを探します。

構文

script-src ポリシーには、1つまたは複数のソースが許可されています。

Content-Security-Policy: script-src <source>;
Content-Security-Policy: script-src <source> <source>;

ソース

<source> can be any one of the values listed in CSP Source Values.

Note that this same set of values can be used in all fetch directives (and a number of other directives).

違反例

この CSP ヘッダーがある場合、

Content-Security-Policy: script-src https://example.com/

以下のスクリプトはブロックされ、読み込みや実行が行われません。

<script src="https://not-example.com/js/library.js"></script>

なお、インラインのイベントハンドラーも同様にブロックされます。

<button id="btn" onclick="doSomething()">

これを addEventListener の呼び出しに置き換えてください。

document.getElementById("btn").addEventListener('click', doSomething);

安全ではないインラインのスクリプト

注: インラインスタイルとインラインスクリプトを禁止することは、 CSP が提供する最大のセキュリティ上の利点の一つです。しかし、どうしても使用しなければならない場合は、それらを許可する仕組みがいくつかあります。

インラインスクリプトとインラインのイベントハンドラーを許可するために 'unsafe-inline' や、インラインブロックに一致するノンスソースまたはハッシュソースを指定することができます。

Content-Security-Policy: script-src 'unsafe-inline';

上記のコンテンツセキュリティポリシーは、インラインの <script> 要素を許可します。

<script>
  var inline = 1;
</script>

nonce-source を使用して、特定のインラインスクリプトブロックのみ許可することができます。

Content-Security-Policy: script-src 'nonce-2726c7f26c'

同じノンスを <script> 要素に指定する必要があります。

<script nonce="2726c7f26c">
  var inline = 1;
</script>

他にも、インラインスクリプトからハッシュを生成することができます。 CSP では sha256, sha384, sha512 に対応しています。

Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='

ハッシュを生成するとき、 <script> タグを含めないようにし、大文字小文字と、ホワイトスペース、特に前後のホワイトスペースに注意してください。

<script>var inline = 1;</script>

安全ではない eval 式

'unsafe-eval' ソース式は、文字列からコードを生成するいくつかのスクリプト実行メソッドを制御します。もし 'unsafe-eval'script-src ディレクティブで指定されていなかった場合、以下のメソッドはブロックされて何の効果も現れません。

strict-dynamic

'strict-dynamic' ソース式は、マークアップ中のスクリプトに明示的に与えられた信頼が、ノンスやハッシュを伴って、そのルートスクリプトによって読み込まれるすべてのスクリプトに伝搬されることを指定します。同時に、 'self''unsafe-inline' のようなホワイトリストやソース表現は無視されます。例えば、 script-src 'strict-dynamic' 'nonce-R4nd0m' https://whitelisted.com/ のようなポリシーでは、 <script nonce="R4nd0m" src="https://example.com/loader.js"> を指定したルートスクリプトの読み込みを許可し、 loader.js で読み込まれたすべてのスクリプトにその信頼性を伝播させますが、 https://whitelisted.com/ からのスクリプトの読み込みは、ノンスを伴っているか、信頼されたスクリプトから読み込まれたものでない限り、許可しません。

script-src 'strict-dynamic' 'nonce-someNonce'

または

script-src 'strict-dynamic' 'sha256-base64EncodedHash'

ユーザーエージェントのスニッフィングを必要とせず、後方互換性のある方法として、 strict-dynamic を指定することができます。.
以下のポリシー、

script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'

は、 CSP1 に対応したブラウザーでは 'unsafe-inline' https: のように動作し、 CSP2 に対応したブラウザーでは https: 'nonce-abcdefg' のように、CSP3 に対応したブラウザーでは 'nonce-abcdefg' 'strict-dynamic' のように動作します。

仕様書

ブラウザーの互換性

BCD tables only load in the browser

関連情報