Category::Plugin

bugtrack_list プラグインで、&と表示される

  • ページ: BugTrack2
  • 投稿者: muu-muu-?
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2006-07-03 (月) 14:15:48
  • バージョン: 1.4.7
  • リリース予定バージョン: 1.5.2

メッセージ

bugtrack プラグインのサマリに、&を含む文字列を入力して追加します。

bugtrack_list プラグインで一覧を表示すると、サマリ中の&が、&となります。

BugTrack2で、BugTrack2/18のサマリを見ると、現象を確認できます。

原因

plugin_bugtrack_list_convert() の戻り値までは、正常だったのですが、その戻り値に対して、どこかで htmlspecialchars を多重に実行しているのだと思いますが、見つける事が出来ませんでした。


  • なるほど、お知らせいただきありがとうございます :) -- henoheno 2006-07-03 (月) 23:09:53
  • いろいろ試してわかったことを書きます。ていうか、試してみたけどわからなかっただけです。 -- 2007-05-03 (木) 04:44:16
    • 'summary' 以外は正常に動作していそうです。
      「'summary', 'name', 'priority', 'state', 'category'」の5つの項目に"(ダブルクオート)を書いて試したところ、
      'summary'だけ " に変わっていました。
      テスト場所は、お試しサイトです。何かの役に立つ・・・といいな。 -- 2007-05-03 (木) 04:44:16
  • ひと休みして調査してみたら原因がわかりました。 -- 2007-05-04 (金) 13:49:11
    • 上のから、値を代入するときが怪しいので見てみました。
      // $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $
      (中略)
      function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE)
      {
      	global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
      (中略)
      	$body = join("\n", $source);
      	foreach(array('summary', 'name', 'priority', 'state', 'category') as $item) {
      		$regex = '/-\s*' . preg_quote($_plugin_bugtrack[$item], '/') . '\s*:(.*)/';
      		if (preg_match($regex, $body, $matches)) {
      			if ($item == 'name') {
      				$$item = strip_bracket(trim($matches[1]));
      			} else {
      				$$item = trim($matches[1]);
      			}
      		} else {
      				$$item = ''; // Data not found
      		}
      	}
      
      	if (preg_match("/\*([^\n]*)/", $body, $matches)) {
      		$summary = $matches[1];
      		make_heading($summary);
      	}
      
      	return array($page, $no, $summary, $name, $priority, $state, $category);
      }
      $summary とそれ以外の大きな違いが、make_heading を使っているかどうかでした。そこで、試しに
      	if (preg_match("/\*([^\n]*)/", $body, $matches)) {
      		$summary = $matches[1];
      		make_heading($summary, FALSE);
      としてみました。その結果、注釈が一覧に表示されるようになったものの、htmlspecialchars の多重実行は解消されました。
      もし、bugtrack.inc.php だけに修正範囲をとどめるのなら、こんなのはどうでしょう?
      // $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $
      (中略)
      function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE)
      {
      -	global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
      +	global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack, $NotePattern;
      (中略)
      
      	if (preg_match("/\*([^\n]*)/", $body, $matches)) {
      -		$summary = $matches[1];
      +		$summary = preg_replace($NotePattern, '', $matches[1]);
      -		make_heading($summary);
      +		make_heading($summary, FALSE);
      	}
      
      	return array($page, $no, $summary, $name, $priority, $state, $category);
      }
      たぶん問題ないと思いますが、確認をお願いします。 -- 2007-05-04 (金) 13:49:11
      • 全パラメータに対してhtmlspecialchars しているところから、$summary をはずすほうが簡単な気が。
  • これだけだと、どこでhtmlspecialchars を実行しているのかがわからないので、追跡調査をしてみました。
    // $Id: html.php,v 1.59 2007/02/11 05:53:30 henoheno Exp $
    (中略)
    function make_heading(& $str, $strip = TRUE)
    {
    (中略)
    	// Cut footnotes and tags
    	if ($strip === TRUE)
    		$str = strip_htmltag(make_link(preg_replace($NotePattern, '', $str)));
    
    	return $id;
    }
    make_heading には、htmlspecialchars が無かったので、次にmake_link を見てみました。
    // $Id: make_link.php,v 1.35 2006/09/30 02:10:50 henoheno Exp $
    (中略)
    // Hyperlink decoration
    function make_link($string, $page = '')
    {
    	global $vars;
    	static $converter;
    
    	if (! isset($converter)) $converter = new InlineConverter();
    
    	$clone = $converter->get_clone($converter);
    
    	return $clone->convert($string, ($page != '') ? $page : $vars['page']);
    }
    
    // Converters of inline element
    class InlineConverter
    {
    	var $converters; // as array()
    	var $pattern;
    	var $pos;
    	var $result;
    
    (中略)
    
    	function convert($string, $page)
    	{
    		$this->page   = $page;
    		$this->result = array();
    
    		$string = preg_replace_callback('/' . $this->pattern . '/x',
    			array(& $this, 'replace'), $string);
    
    		$arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
    		$retval = '';
    		while (! empty($arr)) {
    			$retval .= array_shift($arr) . array_shift($this->result);
    		}
    		return $retval;
    	}
    結論だけを書くためにかなり省略してますが、function convert の中にある
    		$arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
    の部分で1回実行していたようです。
    このプラグイン以外で「 make_heading($str [, TRUE]) 」 のように使っている場所が、同じような問題を抱えているかは調べていませんのであしからず。 -- 2007-05-04 (金) 13:49:11
  • 対応しました。summaryはhtmlscしないようにしました commit:2373432c61 -- umorigu 2016-12-15 (木) 02:17:38


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-12-15 (木) 02:18:07
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.272 sec.

OSDN