PukiWiki 多重includeの深さ制限

2016/06/25 Programming::PukiWiki

PukiWiki 多重includeの深さ制限

多重include(includeの中でincludeを使う)の深さを制限できる改造版includeを作成しました。

制限を超えると、エラーメッセージ

#include(): Limit exceeded (recursive): ページ名

が表示されます。

使い方

  1. 設定
    • 添付の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にするのが良いでしょう。
  2. 設置
    • 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);
    	}
    

関連記事

*1 : if/elseの書き方が気持ち悪いのですが、元の書き方に倣いました。ifの中が全部returnなので、動作上は問題ないはず。

添付

ライセンスはGPLv2 or laterです。(PukiWikiと同じ。)

OK キャンセル 確認 その他