*pcommentをネストした場合の脆弱性(多重書きこみ/無限ループ) [#va23ea16] -ページ: BugTrack -投稿者: [[sky]] -優先順位: 重要 -状態: 着手 -カテゴリー: プラグイン -投稿日: 2004-01-13 (火) 20:50:47 -バージョン: 1.4.2 **メッセージ [#n2c72fdd] プラグインpcommentのコメントページの内に#pcommentを記述してコメントすると ループしてしまいます。 そのために元のページの表示に時間がかかるようになり、最悪ページが表示できなくなります。 これは元になるページとネストされたページの両方にコメントがある場合に起こるようです。 (PHPのバージョンは"4.1.2"です。) ---- -お知らせいただきありがとうございます。ご指摘の問題とは違うのかもしれませんが、 #pcomment によるコメントページの中に #pcomment を挿入した状態で、(ループはしないが)サーバーの負荷を増大させる恐れのある奇妙な書きこみ動作が起る事を確認しました。直せるかわかりませんが、調査を開始します。 -- [[henoheno]] &new{2004-07-10 (土) 09:06:56}; -- 追記: 表示の際に、無限ループを起こすらしいパターンも確認しました。このようなエラーを出してPukiWikiが停止します。 Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 1575 bytes) in /path/to/make_link.php on line 75 -現状の回避策は、plugin/pcomment.inc.php を削除することです。また、cmd=editで該当のページを開くことで、問題の部分を直すことは可能です。 -- [[henoheno]] &new{2004-07-10 (土) 09:08:19}; ------------------------------- ** 表示の際の無限ループ [#s5ddb98e] -この問題はPHPに依存しない、PukiWiki自身の問題の様です。 #pcomment が convert_html() に渡すデータの中に #pcomment が含まれていることをきっかけとして、 pcommentプラグインの初期化と呼び出しを再帰的にコールすることになり、これが最終的にメモリを食いつぶす様です。 -- [[henoheno]] &new{2004-07-10 (土) 22:08:52}; -pcommentとconvert_htmlのどちらを直すべきなのか、まだつかめていません。convet_htmlやmake_linkの修正は私には大仕事です XD -- [[henoheno]] &new{2004-07-10 (土) 22:43:09}; --------------------- - (リリース担当の立場からのコメント) 現状のまま進展がない場合、デフォルトで危険であるとみなし、正式リリースの配布物からはpcommentプラグインを除外します。 -- [[henoheno]] &new{2004-07-27 (火) 23:27:21}; - (開発担当としてのコメント) うーん困りましたね・・・ XD -- [[henoheno]] &new{2004-07-27 (火) 23:28:08}; --------------------- -単純にpcommentプラグインを修正(get_sourceの中から #pcommentをフィルタアウトする)ではいけないですか? -- [[みこ]] &new{2004-07-28 (水) 00:32:59}; function pcmt_get_comments($page, $count, $dir, $reply) { global $_msg_pcomment_restrict; if (!check_readable($page, false, false)) return array(str_replace('$1', $page, $_msg_pcomment_restrict)); - $data = get_source($page); + $data = convert_filter(get_source($page)); <?php // インクルードフィルタ(いずれrules.ini.phpにもっていきたい) $filter_rules = ( "^///(.*?)$" => "", "^#skin\((.*?)\)" => "", "^#tboff\((.*?)\)" => "", "^#pcomment\((.*?)\)" => "", ); // インクルードで余計なものはソースから削除する(func.phpにもっていきたい) function convert_filter($str) { global $filter_rules; static $patternf,$replacef; if (!isset($patternf)) { $patternf = array_map(create_function('$a','return "/$a/";'),array_keys($filter_rules)); $replacef = array_values($filter_rules); unset($filter_rules); } return preg_replace($patternf,$replacef,$str); } ?> -かなり手前味噌な関数ですみません(^^;; 実は本題ページ以外のインクルードするページを何らかの形でフィルタするのは、要望としてBugTrackに提出しようと機会をうかがっていたんですけど・・・(^^; -- [[みこ]] &new{2004-07-28 (水) 00:47:35}; #comment