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;
以下が実行結果です。
<php>
echo FILE . PHP_EOL;
echo DIR . PHP_EOL;
</php>
${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 環境で実際に試してみてください。
<php>
//echo '<pre>';
//var_dump($_SERVER);
//echo '</pre>';
</php>
グローバル変数の調査
グローバル変数も同様です。ここには DokuWiki 特有の値も含まれているため、いろいろ活用できます。
例えば、現在のユーザーに関する情報を以下の様に参照できます。
echo '<pre>'; var_dump($GLOBALS['INFO']['userinfo']); echo '</pre>';
<html><style>
h2.page-header {
font-weight: 600; font-size: 2.4rem; position: relative; padding: 10px 0 10px 16px; margin-top: 3rem !important; margin-bottom: 2rem !important;
}
h2:before {
content: ""; position: absolute; top: 0; left: 0; width: 6px; height: 100%; background: #ccc;
}
div#disqus__thread {
width: 100% !important;
}
</style></html>