ここで誰かが、すべてのインラインJavaScriptにnonce=value
を追加することがキャッシュにどのように影響するかを明確にすることができますか?
Nonceが一意で予測不可能である必要がある場合は、<script nonce="XXXXX">
を使用するページですべてのサーバー側(Varnish、Cloudfrontなど)のキャッシュを無効にする必要があります。正しい?
見る 例4ここ 詳細。
Nonceが一意で予測不可能でなければならない場合は、<script nonce = "XXXXX">を使用するページですべてのサーバー側(Varnish、Cloudfrontなど)のキャッシュを無効にする必要があります。正しい?
はい。動的に生成されるもの(つまり、スクリプトからのもの)のキャッシュは常に無効にする必要があります。一意で予測不可能なランダムな値を静的に提供することはできないため、スクリプトから実行する必要があります。
これは、CSPナンス保護に悪影響を与えることなく、何日もの間アプリケーションサーバーによって適切にキャッシュできます。
いいえ。nonceはすべての要求に対して一意である必要があります(nonce =一度使用された数値)。
唯一の解決策は、ノンスを含むスクリプトタグにキャッシュされていないSSI(サーバー側インクルード)を使用し、それを応答コンテンツセキュリティヘッダーのナンスまたはメタhttp-equiv = "Contentの別の小さなSSIと組み合わせることです-Security-Policy」タグ。
これにより、すべてのページが一意になり、キャッシュできなくなります。
これはどのサーバー側キャッシュに依存するか(これは通常多くのレイヤーを持っているため)アプリケーションサーバーがHTMLをキャッシュして高額なSQLクエリとテンプレート処理を節約している場合でも、途中で出力HTMLを変更してノンスを使用できます。テンプレートとその結果生成されるHTMLには、次のようなプレースホルダーが含まれる場合があります。
<script nonce="CSP_NONCE_PLACEHOLDER">
...
</script>
Thisは、アプリケーションサーバーによって、CSPナンス保護に悪影響を与えることなく、何日間もうまくキャッシュすることができます。
NonceはWebサーバーで動的に生成され、キャッシュされた値を期限切れにすることなく上記のプレースホルダーを置き換えます。
<script nonce="ee4183bb7784017e0ab7d38ab7ef9eb3a75190e0e76ca5daba8cd20104bd8131">
...
</script>
私は何年にもわたって webcookies.org でWebアプリケーションをDjangoで実行し、Redisでキャッシュし、WebサーバーをNginxとして実行しています。後者には2つのオプションがあります。
$ssl_session_id
をnonceとして使用します。 sub_filter_once off;
sub_filter CSP_NONCE_PLACEHOLDER $ssl_session_id;