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>';