#author("2018-12-27T03:46:10+09:00","","")
#author("2018-12-27T03:47:00+09:00;2018-12-27T03:46:10+09:00","","")
* #backの戻り先にURLを指定すると指定URLにリンクできない [#m1e9567d]

- ページ: [[BugTrack2]]
- ページ: [[BugTrack]]
- 投稿者: [[g@kko]]
- 優先順位: 普通
- 状態: 提案
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2007-07-27 (金) 06:56:05
- バージョン: back.inc.php,v 1.9
- バージョン: back.inc.php,v 1.9 (1.4.7)
- リリース予定バージョン: 1.5.2

#contents

** メッセージ [#r5413c7f]
#backの第4引数の“戻り先”にURLを指定することが可能ですが,URLを指定すると指定したURLにリンクできません。


例えば
 #back(,,,http://www.yahoo.co.jp)
とすると,出力されるAタグのhrefは"http%3A%2F%2Fwww.yahoo.co.jp"となりdevであれば,
 http://pukiwiki.sourceforge.jp/dev/http://www.yahoo.co.jp
にアクセスしようとします。

この現象はWindowsXP上で動作する
-ie6, ie7
-Firefox 2
-Opera 9
-Safari 3
-Netscape 7
で現象を確認しました。

**修正案 [#lc1941aa]
 back.inc.php,v 1.9
 line 42-
  	if ($href != '') {
  		if (PLUGIN_BACK_ALLOW_PAGELINK) {
  			if (is_url($href)) {
  				$href = rawurlencode($href);
  			} else {
  				$array = anchor_explode($href);
  				$array[0] = rawurlencode($array[0]);
  				$array[1] = ($array[1] != '') ? '#' . rawurlencode($array[1]) : '';
  				$href = $script . '?' . $array[0] .  $array[1];
  				$link = is_page($array[0]);
  			}
  		} else {
 -			$href = rawurlencode($href);
 +			if (is_url($href)) {
 +				$href = htmlspecialchars($href);
 +			} else {
 +				return PLUGIN_BACK_USAGE . ': Set a page name or an URI';
 +			}
  		}
  	} else {
  		if (! PLUGIN_BACK_ALLOW_JAVASCRIPT)
  			return PLUGIN_BACK_USAGE . ': Set a page name or an URI';
  		$href  = 'javascript:history.go(-1)';
  	}
--------
- 参考:[[test1.4:back]] -- [[g@kko]] &new{2007-07-27 (金) 07:03:14};
- 若干補足を。rawurlencodeを単純にhtmlspecialcharsに置き換えてしまうと、参照先にどんなURIでも設定可能となり、セキュリティ上の問題がある((href="javascript: ... 等))ため、is_urlを通しています。 -- [[g@kko]] &new{2007-08-06 (月) 12:33:26};

//#comment


**メッセージ以外の部分も修正した案 [#kcc30cf5]
投稿者: 名無しさん2 (便宜上の名前ってことで)&br;投稿日: 2007-11-10 (土) 16:15:12

修正内容など
-メッセージに出ている件(微妙に修正方法が違います)
--上の案からの変更理由: %%URL として使うので、htmlspecialchars() だと正しくリンクしないブラウザがあるかも・・・、過去の事例([[BugTrack/792]])%%
---http:// → http%3A%2F%2F にしたら相対リンクになってしまいます。お詫びと訂正します。htmlspecialchars() は、& → & にするため。
---PLUGIN_BACK_ALLOW_PAGELINK がTRUE の時の方もhtmlspecialchars() に修正
--エラーメッセージ部分の変更は、このルートに来るときはURL しか認められていないはずだ、という理由です

-get_fullname() をしていないので、アンカー名のみ記述した場合に、リンクが正しくなかった
--get_fullname() を使うようにした副作用として、ページ名の相対表記も可能になる
--get_fullname() した後にページ名のチェックを追加(エラーメッセージはまだ・・・)

-rawurlencode() した後の物をis_page() しているので、ページが存在するかを正しく収得できていなかった
--例として、「BugTrack2/263」ではなく、「BugTrack2%2F263」というページの存在を確認しに行っていた

-ついでに、[[BugTrack2/260]] の件
-ついでに、[[BugTrack/2260]] の件

[[cvs:plugin/back.inc.php]] (1.9)
  function plugin_back_convert()
  {
 -	global $_msg_back_word, $script;
 +	global $_msg_back_word, $vars;
  
  (中略)
  
  	$link = TRUE;
  	$href = trim($href);
  	if ($href != '') {
  		if (PLUGIN_BACK_ALLOW_PAGELINK) {
  			if (is_url($href)) {
 -				$href = rawurlencode($href);
 +				$href = htmlspecialchars($href);
  			} else {
 +				$refer = isset($vars['page']) ? $vars['page'] : '';
  				$array = anchor_explode($href);
 -				$array[0] = rawurlencode($array[0]);
 -				$array[1] = ($array[1] != '') ? '#' . rawurlencode($array[1]) : '';
 -				$href = $script . '?' . $array[0] .  $array[1];
 -				$link = is_page($array[0]);
 +				$page = get_fullname($array[0], $refer);
 +				if (! is_pagename($page))
 +					return PLUGIN_BACK_USAGE;
 +				$anchor = ($array[1] != '') ? '#' . rawurlencode($array[1]) : '';
 +				$href = get_script_uri() . '?' . rawurlencode($page) .  $anchor;
 +				$link = is_page($page);
  			}
  		} else {
 -			$href = rawurlencode($href);
 +			if (is_url($href)) {
 +				$href = htmlspecialchars($href);
 +			} else {
 +				return PLUGIN_BACK_USAGE . ': Set an URI';
 +			}
  		}
  	} else {

--------
-思慮が足りない + 確認不足で間違えた部分を修正。 -- 名無しさん2 &new{2007-11-15 (木) 19:04:16};
- 修正しました commit:d4db227e91 -- [[umorigu]] &new{2018-12-27 (木) 03:46:10};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.090 sec.

OSDN