*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}; -コメントありがとうございます。データの中に #pcomment がある(からループする)のは認識していたのですが、直しどころをちょっと考えあぐねていたのですよね XD -- [[henoheno]] &new{2004-07-28 (水) 21:03:50}; -汎用的な道具をもって問題を根絶する、というのは私も大好きです :) もう少し意図をお教え下さい。pcomment以外にこのconvert_filter()を使いたい場面はどんな時でしょうか?それは単純に他のページをインクルードしたい時とは少しニーズが異なる気がするのですが、そこが良くわかりません。 -- [[henoheno]] &new{2004-07-28 (水) 21:11:33}; -まずは上記を参考に、データ内部の #pcomment を強制的に抜いてしまう、という対応を取る様にしますね。 -- [[henoheno]] &new{2004-07-28 (水) 21:12:45}; -- [[cvs:plugin/pcomment.inc.php]] (v1.4:1.30, 1.3:1.5.2.1) -ひとつは、この問題はPukiWikiの仕様的な問題(#pcommentのほかに#calendar_viewerも同じ問題を抱えている可能性が高い)と認識しているのと、もうひとつは #calendar_viewer などでインクルードするページ(例:hogehoge内のhogehoge/YYYY-MM-DD) から呼ばれたくないけど、単独で読み出すとき(hogehoge/YYYY-MM-DD)は呼ばれたいプラグインがいくつか(とくにわたしの自作プラグイン群)存在します。 -- [[みこ]] &new{2004-07-29 (木) 01:00:23}; -たとえば、#tboff プラグインとか #include2 プラグインとかですね・・・ -- [[みこ]] &new{2004-07-29 (木) 01:04:55}; #comment ------------------ ** 多重書き込み [#v893fe6e] #comment