#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