WordPressでサイトを作っていると、何かを実現するために、どこかのサイトで入手したコード類を追加したり、思い通りに動作させるためにテーマやプラグインを自作する機会があるでしょう。
例えば前者のどこかで入手したコードを、テーマのfunctions.phpなどへ追加したりするとき、そのデータは安全性が確保されているか?に気を止めたことがあるでしょうか?
本サイトでもいくつかのカスタマイズ用コードを提供していますが、提供する側からすれば、その機能を実現するためのコード例を紹介しているものであり、すべてに対して可能な限りセキュリティに配慮したものを紹介しているかと言われると、答えはノーであり、これは本サイトに限らずどのページでも言えることだと思います。
これは単にセキュリティに無頓着ということではなく、セキュリティに配慮したコードにすればするほど複雑化していくことがあり、機能紹介という本筋から外れてしまうことがあるので敢えて省略したりしているからです。
従って、何かのコードを流用して自身のサイトへ導入する際には、自身でできる限りセキュリティ面に気を遣う必要があります。
そこで本ページでは、WordPressサイトにおけるセキュリティにまつわるいろいろなことを、できるだけこのページで完結できるように、思いつくままに紹介していきます。
思い当たるところがあったら対策されているか確認してみるといいでしょう。
あくまでも私自身の考えや方法であり、誤っている部分や認識の間違いがある部分があるかも知れませんのであしからず..。
WordPress本体のセキュリティはどう保たれているか
コードや自作テーマ・自作プラグインのセキュリティについて紹介していく前に、まずはWordPress本体や、必ず追加しているであろうテーマやプラグインのセキュリティについて触れておきます。
WordPress本体と動作させる環境のセキュリティについて
まず、WordPressは本体+デフォルトテーマ(WordPressインストール時に入っているテーマ)を使用するだけであれば、そのツール自体のセキュリティ状態が保たれるように、有志の皆さんがボランティアで対策をしてくれています。本体やテーマの更新内容を見れば、数々の脅威に対するセキュリティアップに取り組んでもらえていることが分かると思います。言い換えればその恩恵を受けて、より安全にコンテンツを公開させてもらっているということです。
つまり、何も加工や改変をせず、プラグインなども全く追加しない状態で運営している分には、このツールに関しては結構なレベルのセキュリティが保たれているということになるでしょう。
また、調べていくと、WordPressに組み込まれている関数を用いて何かをしたり、自作テーマやプラグインで使う設定画面についても基本的なセキュリティ状態が保たれているように設計されているので、本当にすごいツールであり、制作に携わっている方には感謝しかありません。
SNS等で何かの脆弱性などが見つかったことに対してネガティブな発言をする方が多いですが、それなら自身で1から作ればいいのでは?と個人的にはいつも感じます
ただし、WordPressはウェブサイトを公開するためのサーバー上にインストールして使うツールですから、レンタルサーバー自体のセキュリティに問題があったり、簡単にログインしたりFTPなどのファイル転送ツールを利用できるような使い方をしていれば、そちらの方面から危険にさらすということがある点に注意が必要です。
また、言うまでもありませんが、管理者としてログインされないための対策を行ったり、SSLによる暗号化通信を行って、通信途中で情報が漏洩しないようにするといった、WordPressというツール外での対応も必要です。
プラグイン・テーマ・追加コードのセキュリティについて
WordPress公式サイト上で配布されているテーマやプラグインについては、初回のリリース時には必ずセキュリティチェックが入るようになっていて、これも複数のボランティアの方により検証されています。
ここで初回の..と強調したのは、その後の更新についてはチェックが入ることが少ない、また、新たな何かの脅威が発見された際に星の数ほどあるテーマやプラグインすべてを再チェックすることができないためで、使用している方の多いものについて、SNSなどで第三者から脆弱性に関する指摘がされたりすることがあるのはそのためです。
使用する側としては、本体同様更新にはセキュリティに関するものも多数含まれているので、常に最新のバージョンへ更新すること、環境などの問題で更新できないものは代替を探したり、そのプラグインやテーマを使用する必要性について再考することをおすすめします。
WordPress公式サイト以外で配布されているテーマやプラグイン、コード類については、作者がどこかのサービスを通じてセキュリティチェックをしていない限りは、作者の知識によるセキュリティ施策がすべてとなりますし、ひょっとするとセキュリティ以前に有害なコードが仕込まれているなんてこともあるかも知れないので、使用に際しては注意が必要でしょう。
自身で行えるセキュリティ施策
サイトに何かのカスタムコードを追加したり、テーマやプラグインを自作する際には、せっかくWordPress本体側で行われているセキュリティ対策が無になってしまわぬよう、以下の施策ができているかを確認する必要があります。
ファイルへのアクセスを制限する
プログラムを記述するPHPファイルの冒頭には、そのWordPressが稼働している場所以外から直接ファイルにアクセスすることができないよう、すべてのファイルへ以下のコードを追加した上でプログラムを書いていくようにしましょう。
<?php
//このファイルへの直接アクセスを禁止
if ( !defined( 'ABSPATH' ) ) exit;
ただし、これはPHPファイル(拡張子が.phpのファイル)のみで有効な手法で、CSS(拡張子が.css)やJavaScript(拡張子が.js)などといった実行ファイルでは施策できませんので、それらを制御するphp側から対策を行う必要があります
また、視野を広げてサーバー環境ということを考えれば、WordPressはインストール時に、不正アクセスを防ぐ目的からファイルやフォルダにパーミッション(アクセス権限)設定をしていますから、何かが動かないとパーミッションを変更することは、サイトを危険にさらすことになる、同じ環境にしないと動作しないプログラムになってしまうという点にも留意が必要です。
指定した場所以外から入力させないようにする
どの場所から入力された値なのかを検証して、指定した場所から入力されたものでなければエラーまたは破棄するという機能にnonceというのがあります。
nonceの仕組みなどについては以下の参考ページをご覧ください。
WordPressでは、管理画面のメニューに関する部分や、標準のフロントエンドフォーム(コメントなど)に対して、WordPressの組み込み関数を使用して追加した画面にある入力項目に対しては、自動でnonceチェックが働くようになっています。
現在確認したところでは、投稿や固定ページの編集画面に追加したメタボックスではnonceフィールドは自動追加されないようですので、確認するようにしてください
ないとは思いますが、会員制サイトを作るためのものや、問い合わせフォームを作るためなど、フロントエンドから何かを行うプラグインやカスタマイズコードを使用する際には、nonceによる認証ができているかを必ず確認するようにしましょう。
データベースへ不穏なデータやコードを保存させないようにする
WordPressでは、ほとんどの情報をデータベースのテーブルへデータとして格納しています(これがコンテンツマネージメントシステムたる所以です)。
例えば自作プラグインの設定画面を作り、何かの文字列を入力して保存できるようにしたとします。
この時何も施策をしていなければ、どんな文字列でも保存できてしまいます。
文字列にはページの要素を表示させているHTMLもあれば、何かの動きを持たせるJS、スタイルを定義するCSSなどもあるため、制限をしていなければそれらを出力してしまう種を保存させることになります。
この対策として「サニタイズ(消毒)」という処置をします。
「サニタイズ」は入出力するデータに対して検証と制限をしてセキュリティを保つことの総称ですので、出力時に行うものも同様に「サニタイズ」と呼びます。
また、データに実行ファイルに含まれそうなタグ(例えば「<php」とか「<script>」など)の記号の文字列を変換して、出力されても単なる文字として扱われるようにするための「エスケープ」という処置が必要です。
ここで「nonceでその場所から入力されているかのチェックがされているんだし、管理画面に入らないとその項目へは何も入力できないんだから不要なのでは?」と感じる方もいるでしょう。
確かにそうかも知れません。でも、管理者として不正ログインされ、その項目に不穏なコードを入れられ、それがノーチェックで実行されたら...サイトの改ざんや破壊はここから起こる可能性も高いのです。
WordPressに自作のプラグインを作り、そこに設定画面を追加した時のサニタイズ処理方法については、以下のページを参考に、コードの確認をしてみてください。
それから、フォームで使われる「input」「textarea」などのタグのオプションでも、入力値の検証が行えますので、これまで「サニタイズ」「エスケープ」と併せて、安全なデータを保存できるようにしましょう。
興味があれば、現在使用しているプラグインやテーマでもきちんと施策がされているかを確認してみると、対策の仕方がいろいろあり、新たなヒントも得られるかも知れません。
不穏なデータやコードを出力しないようにする
最後に、HTML上へ出力する際の対策です。
何かのコードを使ってHTML上に何かを出力する機会では「echo」または「return」を使うか、PHPから直接出力するなどといった方法を用いることが多いです。
基本的に「echo」や「return」の後で出力することが明確なデータの場合は、入力値をデータベースに保存する段階から、以下のようにすることでより安全になります。
- 全体ではなく、必要な部分(文字列など)だけを入力値として保存する
- 入力値を引っ張り出したものをエスケープして変数として格納する
- 出力するHTMLタグと変数を使って「echo」や「return」で出力する
「echo」と「return」はどちらも内容を出力するためのものですが、ざっくりいうと「return」が結果を返すのに対し、「echo」はそのまま返す性質から「return」の方がより安全なで、「echo」ではなく「return」で返せるようにコードを作っていくのもセキュリティアップにつながると思います。
また、サニタイズ関数やエスケープ関数などを使って出力時にもフィルターをかけることを忘れずに行いましょう。
コメントを残す