#backの戻り先にURLを指定すると指定URLにリンクできない

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

メッセージ

#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 で現象を確認しました。

修正案

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 2007-07-27 (金) 07:03:14
  • 若干補足を。rawurlencodeを単純にhtmlspecialcharsに置き換えてしまうと、参照先にどんなURIでも設定可能となり、セキュリティ上の問題がある*1ため、is_urlを通しています。 -- g@kko 2007-08-06 (月) 12:33:26

メッセージ以外の部分も修正した案

投稿者: 名無しさん2 (便宜上の名前ってことで)
投稿日: 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」というページの存在を確認しに行っていた

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 2007-11-15 (木) 19:04:16
  • 修正しました commit:d4db227e91 -- umorigu 2018-12-27 (木) 03:46:10


*1 href="javascript: ... 等

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-27 (木) 03:46:10
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.311 sec.

OSDN