Exec-PHPの使用について、なぜexec-PHPがモテるのか、WordPressを使ってる僕が気になったある記事のこと、等、様々な意見が出て、盛り上がりを見せています。
Exec-PHP をローカルでざっと試してみた。分かったのは、
- 投稿の本文に <php コード ?> を記述すると、eval で評価する(PHP として実行する)
- 管理者等一部のユーザーの投稿のみ、eval で評価する対象となる
という処理を行うらしい、ということです。
投稿の中で PHP コードを書いて実行できると、確かに自由度があがります。しかし、任意の PHP コードが実行できてしまうと、セキュリティリスクが高まります。
- (管理者パスワード漏洩/ブルートフォースアタック等で)不正ログインされた後、投稿本文にコードを書き込まれる
- SQLインジェクション/CSRF脆弱性があると、悪意あるPHPコードを投稿本文に埋め込まれる(本文を改ざんされても、通常はPHPコードまでは実行されないが、Exec-PHPを入れるとPHPコードが実行される)
等により、攻撃者が埋め込んだコードを実行してしまう、という危険が考えられます。小さな抜け穴がどこかにあった場合に、「任意の PHP コードができる」ことが重大な影響を及ぼします。もし、Exec-PHP プラグインを使用しない場合でも、他のプラグインなどを導入して本文をevalで評価していれば危険です。
Exec-PHP を使わないでカスタマイズする
任意の PHP コードを実行する必要性があるでしょうか。私はPHPの解説書を執筆する時に、eval を利用してコードとその実行結果を表示する、という処理をしたことがあります。この場合は確かに様々な PHP コードを書いて実行しました。本当に様々な PHP コードを書いて実行する必要があるなら、Exec-PHP を使うのも一案ですが、しかしこのようなケースはごく稀だとおもいます。Exec-PHP を使わないでカスタマイズできるのであれば、Exec-PHP を避けるのが好ましいでしょう。
代替案としては、WordPressショートコード作成方法で紹介されている、「ショートコードを使う」が一番適切だと思います。投稿の本文内に埋め込むことができ、プログラム処理を実行できます。実行されるのは任意の PHP コードではなく、予め指定したショートコードの処理だけです。
予めショートコードを作っておく、という手間がかかりますが、定義したショートコード以外の PHP コードを実行されてしまうことは避けられます。
Exec-PHP を使わなければ万全か?
Exec-PHP を有効にし、管理画面から PHP コードを書き込みして実行できてしまうと、管理者権限を奪われると任意の PHP コードを実行されてしまいます。
では、Exec-PHP を使わなければ万全なのでしょうか。WordPress 本体には管理画面からテーマやプラグインのファイルを編集する機能があります。もし、この機能を残しているのであれば、Exec-PHP を使う場合と状況はさほど変わりません。(不正ログイン等に成功すれば、テーマファイルを書き換えることで PHP コード実行ができてしまいます。)
テーマやプラグインのファイルを編集する機能は、無効にすることができます。wp-includes/capabilities.php の edit_files, edit_plugins, edit_themes の項目のところを見ると、DISALLOW_FILE_EDIT という定数で設定できる事が分かります。Codex にも記載されています(公式ドキュメントは、レスキューワーク株式会社等により更新されています)。wp-config.php で
define('DISALLOW_FILE_EDIT',true);
と記述すれば、テーマやプラグインのファイルを編集する機能を無効にすることができます。
プラグインやテーマのインストールや更新を無効にする方法は、
define('DISALLOW_FILE_MODS',true);
です。ただし、これを記述すると、WordPress 本体の更新もできなくなります。アップデート版が公開されたら素早く手動アップデートできる運用体制でないと、かえってリスクを高めることもありますのでご注意ください。
[…] Exec-PHPを避ける理由 […]
[…] Exec-PHPを避ける理由 […]
[…] Exec-PHPを避ける理由 […]