Wiki上の外部リンクをクリックすると、リンク先のページにはRefererとしてWikiのURL(つまり、ページ名も)が渡ってしまいます。社内システムや非公開URLにあるWikiなどでは、顧客名やプロジェクト名等が漏れることが、問題となることがあります。このような場合は、WikiのURLが推測できないリダイレクトページを経由させることで、WikiのURLが漏洩しないようにすることができます。
pukiwiki.ini.php
// NOTE: Keep (page-name + attach-file-name) <= PKWK_QUERY_STRING_MAX define('PKWK_QUERY_STRING_MAX', 640); // Bytes, 0 = OFF + function convertglobalurl($href) { + if ((preg_match("%^https?://".SERVER_NAME."%", $href))) + return $href; + return "../../redirect.php?".urlencode($href); + } + ///////////////////////////////////////////////// // Experimental features
lib/init.php(下記の部分はincludeの後に移動する)
! define('S_COPYRIGHT', ! '<strong>PukiWiki ' . S_VERSION . '</strong>' . ! ' Copyright © 2001-2006' . ! ' <a href="'.convertglobalurl("http://pukiwiki.sourceforge.jp/").'">PukiWiki Developers Team</a>.' . ! ' License is <a href="'.convertglobalurl("http://www.gnu.org/licenses/gpl.html").'">GPL</a>.<br />' . ! ' Based on "PukiWiki" 1.3 by <a href="'.convertglobalurl("http://factage.com/yu-ji/").'">yu-ji</a>' ! );
lib/make_link.php
*************** *** 385,391 **** } else { $rel = ' rel="nofollow"'; } ! return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>'; } } --- 385,391 ---- } else { $rel = ' rel="nofollow"'; } ! return '<a href="' . convertglobalurl($this->name) . '"' . $rel . '>' . $this->alias . '</a>'; } } *************** *** 423,429 **** function toString() { ! return '<a href="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>'; } } --- 423,429 ---- function toString() { ! return '<a href="' . convertglobalurl($this->name) . '" rel="nofollow">' . $this->alias . '</a>'; } } *************** *** 533,539 **** function toString() { ! return '<a href="' . $this->url . $this->anchor . '" title="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>'; } } --- 533,539 ---- function toString() { ! return '<a href="' . convertglobalurl($this->url . $this->anchor) . '" title="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>'; } } *************** *** 711,717 **** $s_page = htmlspecialchars(strip_bracket($page)); $s_alias = ($alias == '') ? $s_page : $alias; ! if ($page == '') return '<a href="' . $anchor . '">' . $s_alias . '</a>'; $r_page = rawurlencode($page); $r_refer = ($refer == '') ? '' : '&refer=' . rawurlencode($refer); --- 711,717 ---- $s_page = htmlspecialchars(strip_bracket($page)); $s_alias = ($alias == '') ? $s_page : $alias; ! if ($page == '') return '<a href="' . convertglobalurl($anchor) . '">' . $s_alias . '</a>'; $r_page = rawurlencode($page); $r_refer = ($refer == '') ? '' : '&refer=' . rawurlencode($refer);
plugin/showrss.inc.php
*************** *** 85,91 **** $link = $item['LINK']; $title = $item['TITLE']; $passage = get_passage($item['_TIMESTAMP']); ! $link = '<a href="' . $link . '" title="' . $title . ' ' . $passage . '" rel="nofollow">' . $title . '</a>'; $this->items[$date][] = $this->format_link($link); } --- 85,91 ---- $link = $item['LINK']; $title = $item['TITLE']; $passage = get_passage($item['_TIMESTAMP']); ! $link = '<a href="' . convertglobalurl($link) . '" title="' . $title . ' ' . $passage . '" rel="nofollow">' . $title . '</a>'; $this->items[$date][] = $this->format_link($link); }
--- interwiki.inc.php.070911 2007-09-11 22:52:09.078125000 +0900 +++ interwiki.inc.php 2007-09-11 22:53:10.687500000 +0900 @@ -18,7 +18,7 @@ if ($url === FALSE) return plugin_interwiki_invalid(); pkwk_headers_sent(); - header('Location: ' . $url); + header('Location: ' . convertglobalurl($url)); exit; } --- lookup.inc.php.070911 2007-09-11 22:52:25.593750000 +0900 +++ lookup.inc.php 2007-09-11 22:53:00.390625000 +0900 @@ -59,7 +59,7 @@ } pkwk_headers_sent(); - header('Location: ' . $url); // Publish as GET method + header('Location: ' . convertglobalurl($url)); // Publish as GET method exit; } ?>
<?php $target = htmlspecialchars(urldecode(@$_SERVER["QUERY_STRING"]), ENT_QUOTES); $meta = ""; if (ereg('^https?://[-a-zA-Z0-9]+\.somedomain\.com/', @$_SERVER["HTTP_REFERER"])) $meta = '<META http-equiv="refresh" content="5;url='.$target.'">'; ?> <HTML><HEAD><TITLE>redirect.php</TITLE><?=$meta ?></HEAD><BODY> <H1>redirect to <A href="<?=$target ?>"><?=$target ?></A></H1> <HR> </BODY></HTML>
JavaScriptを利用して、本体実装への影響を少なくしつつリファラ対応を入れました。(by umorigu)
// Show External Link Cushion Page // 0: Disabled // 1: Enabled $external_link_cushion_page = 1; $external_link_cushion = array( // Wait N seconds before jumping to an external site 'wait_seconds' => 5, // Internal site domain list 'internal_domains' => array( 'localhost', '*.example.com', ), // Don't show extenal link icons on these domains 'silent_external_domains' => array( 'pukiwiki.osdn.jp', 'pukiwiki.example.com', ), );