ページ本文へ移動
炭火ブログ

MENU

ねこ ねこ

ブログにCSP script-src導入でセキュリティを強固にする方法

WordPressで作ったサイトにContent Security Policyを設定してセキュリティを高めようと考え、試行錯誤の結果なんとかなったように思います。

Content Security Policyで苦労するのは「script-src」の設定で、動作を許可するJavaScriptを特定し、ハッシュ値やnonce値を付与することで許可しないJavaScriptを動作させません。nonce値は1回限りの使用とするとのことなので、ページをキャッシュする場合のnonce値の扱いをどうすれば良いのか分かりません。

そこで、ハッシュ値を求める方法で「script-src」の許可しようとしましたが、生成AIや調べたページによって設定の方法が大きく違い、どうすればよいのか迷います。どう記述すればできるだけセキュリティを高め、ページを見てくださる方に迷惑をかけないかを調べることにします。

AmazonスマイルSale
目次
  1. 「script-src」で何を許可すれば良いのか
  2. PageSpeed Insightsの指摘内容
  3. Json-ld形式の構造化データについて
  4. どうにもならなかったCloudflare ボットファイトモード

「script-src」で何を許可すれば良いのか

「script-src」の記述方法について調べると

「'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」で計測すると次の指摘を受けます。

このことから考えて下の記述にしています。

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値を付与するには有料契約が必要です。

多分無理だとは思うのですが、完全には諦めていないので、良い方法がないか探します。

最後までお読みいただき、誠にありがとうございます。