PukiWiki 多重includeの深さ制限
2016/06/25
PukiWiki 多重includeの深さ制限
多重include(includeの中でincludeを使う)の深さを制限できる改造版includeを作成しました。
制限を超えると、エラーメッセージ
#include(): Limit exceeded (recursive): ページ名
が表示されます。
使い方
- 設定
- 添付のinclude.inc.php内のPLUGIN_INCLUDE_MAX_DEPTHを、必要に応じて変更します。
// Max depth of recursive include define('PLUGIN_INCLUDE_MAX_DEPTH', 2);
- 1で多重include禁止、2で二重まで許可。以降数字を増やすごとに許可される深さが増えます。
- 0は無制限(もとのincludeと同じ)。
- PukiWiki bodycache改良版のデフォルト設定は、二重includeまで対応しています。ただし、pcommentも含めて二重なので、pcommentで深さを1つ消費すると考えるとPLUGIN_INCLUDE_MAX_DEPTHの設定は1にするのが良いでしょう。
- 添付のinclude.inc.php内のPLUGIN_INCLUDE_MAX_DEPTHを、必要に応じて変更します。
- 設置
- include.inc.phpを、PukiWikiに元からあるinclude.inc.phpと置き換えます。
参考:改造内容
- 上の方に設定値を追加
// Max depth of recursive include define('PLUGIN_INCLUDE_MAX_DEPTH', 2); // e.g. // PLUGIN_INCLUDE_MAX_DEPTH=0: no prohibition // PLUGIN_INCLUDE_MAX_DEPTH=1: prohibit recursive include
- function plugin_include_convertの冒頭に変数$depthを追加。
function plugin_include_convert() { global $script, $vars, $get, $post, $menubar, $_msg_include_restrict; static $included = array(); static $count = 1; static $depth = 1; //追加
- PLUGIN_INCLUDE_MAX判定の直後に、PLUGIN_INCLUDE_MAX_DEPTHの判定を追加。*1
if (isset($included[$page])) { return '#include(): Included already: ' . $link . '<br />' . "\n"; } if (! is_page($page)) { return '#include(): No such page: ' . $s_page . '<br />' . "\n"; } if ($count > PLUGIN_INCLUDE_MAX) { return '#include(): Limit exceeded: ' . $link . '<br />' . "\n"; } if ($depth > PLUGIN_INCLUDE_MAX_DEPTH && PLUGIN_INCLUDE_MAX_DEPTH > 0) { //追加 return '#include(): Limit exceeded (recursive): ' . $link . '<br />' . "\n"; //追加 } else { ++$count; }
- convert_htmlの前後に、$depthのインクリメントとデクリメントを追加。
if (check_readable($page, false, false)) { ++$depth; //追加 $body = convert_html(get_source($page)); --$depth; //追加 } else { $body = str_replace('$1', $page, $_msg_include_restrict); }
関連記事
添付
- include_max_depth_20160625.zip
- include.inc.php: 改造版include、元のincludeと差し替える。PukiWiki 1.5.1用。
ライセンスはGPLv2 or laterです。(PukiWikiと同じ。)