Content Security PolicyをWordPressに対応する方法

概要

Content Security Policy(CSP)について。最後にWordPressに導入する方法を説明する。

Content Security Policy(CSP)

Content Security Policy
サーバー側でスクリプトのホワイトリストを作成することで、サイト上で実行するスクリプトファイルやインラインの<sctipt>要素やhtml属性のイベントハンドラ(<div onclick="..">など)を制御する機能。ホワイトリストに含まれないスクリプトのコードは無視される。

Content Security Policy(CSP)は、ホワイトリスト以外のスクリプトを実行させなくするので、かなり強力なセキュリティー対策になる。FacebookやTwitterなどあらゆるウェブサービスでもContent Security Policyが設定されている。Content Security Policyで適切なホワイトリストを作成するのはかなり骨の折れる作業だ。効果は強力なのだが、サイト設計や運営方法によっては、導入は難しい。

 

導入非推奨

  • インラインスタイル(<p style="color:red">)を多用しているサイト
  • インラインスクリプト(<script>......</script>)を多用しているサイト

Content-Security-Policyの基本文法

Content-Security-Policy ...your-white-list...

 

...your-white-list...に登録したいスクリプトやファイルを記述していく。

以下、各項目である。

  • default-src
  • script-src
  • style-src
  • font-src
  • frame-src
  • img-src
  • media-src
  • object-src
  • base-uri
  • child-src
  • connect-src

どの項目にどのURLやファイルを登録するかは、レポート結果を見て判断すれば良いので、必ずしも各項目を細かく理解する必要はない。

具体的なポリシーの書き方

まず、wp-config.phpと同じ階層にある.htaccessに以下の設定をする。

.htacess


Header set Content-Security-Policy "defaule-src 'self'"

上記のコードだけで、ひとまずContent-Security-Policyは適応される。
ただ、上記のコードだけでは必要なスクリプトが実行されなくなる。

なので、サイトに適したホワイトリストを作成するまでは、Content-Security-Policy-Report-Only ...your-white-list...を使う。

.htacess


Header set Content-Security-Policy-Report-Only "default-src 'self';report-uri https://example.com"

この場合、report-uriは必須だ。https://example.comには、ホワイトリストに阻まれて実行できないスクリプトファイルを報告するURLを書く。

レポートを受け取る場としては、Report URI(https://report-uri.com)が使いやすい。

Report URIに登録し、配布されたURLをhttps://example.comの箇所に書く。

サイトをリロードするたびに実行不可になったスクリプトが報告されるので、あとはReport URIの管理画面を見ながらホワイトリストに追加していく作業になる。

ホワイトリストが完成したら、Googleが提供するCSP Evaluatorでポリシーの安全性や適切に記述できているかをチェックする。

https://csp-evaluator.withgoogle.com/

よければ、Header set Content-Security-Policyに変更し、完了となる。

WordPressサイトに取り入れる方法

WordPress自体が設計上インラインスクリプトを使っているため、WordPressと相性が悪い。管理画面にも重要箇所にインラインスクリプトが多用されている。

そのため、上記の手順でContent Security Policyを導入した場合、管理画面が崩れるだろう。

運用に支障をきたすので、管理画面のみContent Security Policyの設定を外さなければいけない。

管理画面のみContent Security Policyの設定を外す

wp-adminディレクトリにある.htaccessに移動する。

wp-adminディレクトリの.htacess


Header unset Content-Security-Policy

上記の記述によってContent Security Policyの設定を外す。

 

管理画面が適切に表示されたら、作業は完了となる。

 

他にもWordPressセキュリティー対策について以下の記事で紹介している。

 

 

.