dokuwiki:embedded_php

DokuWiki PHP埋め込みのあれこれ

DokuWiki には、コンテンツに直接PHPを記述できる、とても便利で危険な機能があります。

この機能を投稿が公開された Wiki で有効にすれば、まず間違いなく問題が起こるでしょう。

名前空間毎に有効、無効を切り替えられればいいのですが、そういった機能は無いので、コンテンツの編集が管理者に閉じられた Wiki でしか使えません。

普段は静的なコンテンツを記述しているけど、一部だけ DB から値を読み出したい!という場合に便利です。

DB から値を読み出すだけであれば、HTML埋め込み機能を利用してフロントを Vue.js で記述し WebAPI を用意してクライアントサイドで描画する、という手もあるのですが、

  • DB から読み出す値が SEO に関係する
  • DB から読み出す値を ACL を介して表示したい

等の場合は、サーバーサイドで処理した方が良い結果を得られると思います。

以下のコードを埋め込むことで、埋め込まれた PHP が実際に何処で実行されているかが判ります。

echo __FILE__ . PHP_EOL;
echo __DIR__ . PHP_EOL;

以下が実行結果です。

/var/repos/burdock/wws.jp/inc/parser/xhtml.php(559) : eval()'d code /var/repos/burdock/wws.jp/inc/parser

${DOKU_ROOT}/inc/parser/xhtml.php(549) : eval()'d code
${DOKU_ROOT}/inc/parser

悪名高き eval() が実行されていることが判ります。ご利用は計画的に。。。

https://www.php.net/manual/ja/function.eval.php

実行ファイルパスが判ったので、autoload 等を相対パスで呼び出せます。
# 絶対パスで autoload を呼んでもいいのですが、環境依存になるので避けたいところです。

その他、サーバー変数に設定されている値なども、同じ様に調査できます。

echo '<pre>';
var_dump($_SERVER);
echo '</pre>';

出力結果は省略します。みなさんの DokuWiki 環境で実際に試してみてください。

グローバル変数も同様です。ここには DokuWiki 特有の値も含まれているため、いろいろ活用できます。
例えば、現在のユーザーに関する情報を以下の様に参照できます。

echo '<pre>';
var_dump($GLOBALS['INFO']['userinfo']);
echo '</pre>';

  • dokuwiki/embedded_php.txt
  • 最終更新: 2022/02/04 11:33
  • by admin