スクリプトおよびスタイル要素のHTMLの「nonce」属性の目的は何ですか?


139

W3Cは、そこと呼ばれるHTML5.1で新しい属性であると言うnonceためには、styleおよびscriptそのウェブサイトのコンテンツセキュリティポリシーで使用することができます。

私はそれについてググりましたが、最終的に、この属性が実際に何をするか、それを使用すると何が変わるのかわかりませんでしたか?


2
ルックス、それはあなたのサイトのためのセキュリティのちょうど余分なビットだように、ページが提供されたときにnonceがあなたと一致しない場合、あなたは、あなたがページを提供していない、リンクまたはフォームに追加し、
ピート

@ピートあなたはそれから誰もあなたscriptをロードすることができなかったことを意味しますstyleか?ホットリンク禁止のようなもの?
ata

通常のページとフォームの検証用でもあります
Pete

回答:


195

このnonce属性を使用すると、CSP ディレクティブ(すべてのインライン/ を許可する)の使用を回避しながら、特定のインラインscriptおよびstyle要素を「ホワイトリスト」に登録unsafe-inlineできるため、一般にインライン/ を禁止する主要なCSP機能を保持できます。scriptstylescriptstyle

したがって、このnonce属性は、特定のスクリプトまたはスタイル要素のインラインコンテンツが一部の(悪意のある)サードパーティによってドキュメントに挿入されたのではなく、ドキュメントが提供されるサーバーを制御する人によって意図的にドキュメントに挿入されたことをブラウザに伝える方法ですから。

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_itは、nonce属性の使用方法の良い例を示しています。これは、次の手順になります。

  1. Webサーバーが特定のドキュメントについて受信するすべての要求について、バックエンドに、暗号化された安全な乱数ジェネレータから少なくとも128ビットのデータのランダムなbase64エンコード文字列を生成させます。例えば、EDNnf03nceIOfn39fn3e9h3sdfa。それはあなたのナンスです。

  2. ステップ1で生成されたノンスを取得し、インラインscript/ style「ホワイトリスト」にしたい場合は、バックエンドコードnonceがそのノンスを値として送信される前に、ドキュメントに属性を挿入します。

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. ステップ1で生成されたnonceを先頭に付加nonce-し、バックエンドでscript-srcorのソースリストの値の中でCSPヘッダーを生成しますstyle-src

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

したがって、ナンスを使用するメカニズムは、代わりにバックエンドにインラインのコンテンツのハッシュを生成させるscriptstyle、許可したい場合の代替手段であり、そのハッシュをCSPヘッダーの適切なソースリストで指定します。

ブラウザーはページリクエスト間で変更されたナンス値の変更を確認できない(できない)ため、上記の1をスキップして、バックエンドでノンスに対して動的に何もしないようにすることは可能です(まったくお勧めできません)。ちょうど置くことができnonce、あなたのドキュメントのHTMLソースに静的な値を持つ属性を、その同じノンス値と静的CSPヘッダを送信します。

しかし、静的ナンスをそのように使用したくない理由は、最初からナンスを使用する目的全体をかなり損なっているからです。なぜなら、そのような静的ナンスを使用すると、その時点では、単にを使用することもできますunsafe-inline


17
これは、ユーザーを確認するためのものではありません。特定のスクリプトまたはスタイル要素のインラインコンテンツが一部の(悪意のある)サードパーティのドキュメントに挿入されていないことを確認するためのものです。から提供されます。(私はそれを言うために私の答えを更新します。)
sideshowbarker

3
nonceを保存する必要はありません。代わりにメモリ内で生成され、CSPヘッダーと応答でワイヤ経由で送信されるHTMLドキュメントに挿入されます(サーバーファイルシステム/データベースに保存されているソースには送信されません)。
sideshowbarker 2017年

3
nonce属性の使用に力を入れる理由がある限り、絶対に使用する必要がない場合は使用しないでください。これは本当に、何らかの理由で特定のドキュメントからインラインスクリプトやスタイルコンテンツを(まだ)削除できない場合にのみ意味があります(ただし、後で削除する必要があります)。そのため、何らかの理由でインラインスクリプトとスタイルのコンテンツを保持する必要がある場合は、少なくともnonceメカニズムを使用して、ブラウザに問題がないことを確認させることができます。それ以外の場合は、実際に意図したとおりにCSPを完全に使用し、インラインスクリプトやスタイル要素を許可しないでください
sideshowbarker

2
@sideshowbarker、空のナンスは何をしますか?<script type="text/javascript" nonce>andのあるページが表示されます<style type="text/css" nonce>
Pacerier

7
注:スクリプトが静的な場合は、nonceではなくCSPハッシュをお勧めします。
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.