ブログにCSP script-src導入でセキュリティを強固にする方法
WordPressで作ったサイトにContent Security Policyを設定してセキュリティを高めようと考え、試行錯誤の結果なんとかなったように思います。
Content Security Policyで苦労するのは「script-src」の設定で、動作を許可するJavaScriptを特定し、ハッシュ値やnonce値を付与することで許可しないJavaScriptを動作させません。nonce値は1回限りの使用とするとのことなので、ページをキャッシュする場合のnonce値の扱いをどうすれば良いのか分かりません。
そこで、ハッシュ値を求める方法で「script-src」の許可しようとしましたが、生成AIや調べたページによって設定の方法が大きく違い、どうすればよいのか迷います。どう記述すればできるだけセキュリティを高め、ページを見てくださる方に迷惑をかけないかを調べることにします。

目次
「script-src」で何を許可すれば良いのか
「script-src」の記述方法について調べると
- 「'unsafe-inline' https: http:」はセキュリティ上の問題が大きいので使用を避ける。
- 「'strict-dynamic'」を記述し有効に動作する場合は「'unsafe-inline'」は無視されるのでフォールバックとして記述しても良い。
「'strict-dynamic'」の役割はnonce値やハッシュ値を付与されたスクリプトが生成する<script>タグにも信用を及ぼす効果があります。ただし「'strict-dynamic'」を認識しないブラウザの場合は「'unsafe-inline'」が効果を持ちセキュリティは無くなりますが、スクリプトは動作することになります。
レポートを見てみると古いブラウザの場合にハッシュ値の照合を行わず警告が出るようです。その場合はWeb作成者としてはどうすることもできないので、セキュリティを無くしスクリプトを動かす方が良いのではないでしょうか。
CSPを設定しない場合のセキュリティレベルはCSPを設定し「'unsafe-inline'」が適用されいいる状態と同じと言えるでしょう。現在において「'strict-dynamic'」を認識しないブラウザはあまりないので、ハッシュ値で許可をし「'strict-dynamic'」を記述することで「'unsafe-inline'」を無効にし、「'strict-dynamic'」を認識しないブラウザに対してはセキュリティレベルを0にしてスクリプトを動かそうと思います。
PageSpeed Insightsの指摘内容
CSPを設定しない状態だとすべてのブラウザでセキュリティレベルは0です。「'strict-dynamic'」と「'unsafe-inline'」を併用することでほとんどのブラウザでクロスサイトスクリプティング(XSS)のリスク軽減が可能となります。加えて「'unsafe-inline' https: http:」の記述がない状態で「PageSpeed Insights」で計測すると次の指摘を受けます。
- 古いブラウザとの下位互換性を保つため、`'unsafe-inline'` を追加することを検討してください(nonce / hash をサポートしているブラウザでは無視されます)。
- 古いブラウザとの下位互換性を保つため、https: と http: の URL スキームを追加することを検討してください(`'strict-dynamic'` をサポートしているブラウザでは無視されます)。
このことから考えて下の記述にしています。
script-src 'sha256-XXX=' 'sha256-YYY=' 'sha256-zzz=' 'strict-dynamic' 'unsafe-inline' https: http:;
Json-ld形式の構造化データについて
Json-ld形式の構造化データは<script type="application/ld+json"></script>として出力します。JavaScriptではありませんが、scriptタグなのでハッシュ値を求める必要があります。構造化データは JavaScriptを実行するわけではなく、type="application/ld+json" によって 実行不可なスクリプトと扱われるため、基本的にはCSPの script-src に影響されません。
どうにもならなかったCloudflare ボットファイトモード
悪質なボットからサイトを守ってくれる「Cloudflare ボットファイトモード」ですがCSPの設定はできませんでした。
インラインスクリプトに含まれる数値が頻繁に変化するようでハッシュ値を求めて登録しても、しばらくするとコンソールに警告が出ます。Cloudflareのヘルプを見るとnonce値を付けるように書かれていますが、Cloudflareの機能でnonce値を付与するには有料契約が必要です。
多分無理だとは思うのですが、完全には諦めていないので、良い方法がないか探します。
最後までお読みいただき、誠にありがとうございます。