外部リンクをリダイレクトページ経由にすることで、Refererを消す


メッセージ

Wiki上の外部リンクをクリックすると、リンク先のページにはRefererとしてWikiのURL(つまり、ページ名も)が渡ってしまいます。社内システムや非公開URLにあるWikiなどでは、顧客名やプロジェクト名等が漏れることが、問題となることがあります。このような場合は、WikiのURLが推測できないリダイレクトページを経由させることで、WikiのURLが漏洩しないようにすることができます。

パッチ例 (2007年6月実装)

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 &copy; 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 == '') ? '' : '&amp;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 == '') ? '' : '&amp;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;
 }
 ?>

redirect.php例

<?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>

問題点

コメント

2018年3月版実装

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',
       ),
);

コメント (2018年3月実装以降)


関連


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-23 (金) 01:59:29
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.289 sec.

SourceForge