- 追加された行はこの色です。
- 削除された行はこの色です。
* #backの戻り先にURLを指定すると指定URLにリンクできない [#m1e9567d]
- ページ: [[BugTrack2]]
- 投稿者: 名無しさん
- 優先順位: 普通
- 状態: 提案
- カテゴリー: プラグイン
- 投稿日: 2007-07-27 (金) 06:56:05
- バージョン: back.inc.php,v 1.9
#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]] -- &new{2007-07-27 (金) 07:03:14};
- 若干補足を。rawurlencodeを単純にhtmlspecialcharsに置き換えてしまうと、参照先にどんなURIでも設定可能となり、セキュリティ上の問題がある((href="javascript: ... 等))ため、is_urlを通しています。 -- &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]] の件
[[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};
#comment