2004年02月24日

Refererを隠す

PukiWikiを閉じた環境で運用していると、各ページに結構重要な情報を載せることが多くなると思いますが、ついうっかり「ネットワーク機器設定一覧」なんて言うページを作って、そんなページから外部にリンクを張ってしまうとリファラにばっちり残ってしまい攻撃の際の目処になりかねません。

そこでRefererでページ名称が外部に残らないように、ちょっとPukiWikiを改造してみることにしました。

PukiWiki1.4.7の「make_link.php」を以下のように変更
388行目
return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
               ↓
return '<a href="hiddenref.php/' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';

426行目
return '<a href="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>';
               ↓
return '<a href="hiddenref.php/' . $this->name . '" rel="nofollow">' . $this->alias . '</a>';
次に同じ場所にhiddenref.phpという名前で次のphpファイルを作成します
<?php
 if(ereg("^http[s]?://[^/]*".getenv("HTTP_HOST")."/",getenv("HTTP_REFERER"))){
  $path = getenv("PATH_INFO");
  if(getenv("QUERY_STRING") != ''){
   $path .= '?' . getenv("QUERY_STRING");
  }
  $path = preg_replace("/^\//",'',$path);
  $path = ereg_replace("\"",'%22',$path);
  $path = ereg_replace("<",'%3C',$path);
  $path = ereg_replace(">",'%3E',$path);
  echo "<html>\n";
  echo "<head>\n";
  echo "<meta http-equiv=i\"Content-Typei\" content=\"text/html; charset=EUC-JP\" />\n";
  if(ereg("^http[s]?://","$path") || ereg("^ftp://","$path")){
   echo "<meta http-equiv=\"refresh\" content=\"1;URL=$path\">\n";
   echo "</head>\n";
   echo "<body>\n";
   echo "転送中...\n";
  }else{
   echo "</head>\n";
   echo "<body>\n";
   echo "適切なURLではありません\n";
  }
  echo "</body>\n";
  echo "</html>";
 }else{
echo <<<HIRE
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL was not found on this server.<P>
<HR>
<ADDRESS>Server "Apache"</ADDRESS>
</BODY></HTML>
HIRE;
 }
?>
これを全てサーバにアップすれば完了です。

この方法ではブラウザの仕様(バグ?)を用いてRefererを消しているため、相手にはどこからのアクセスか全く判りません。
まぁ、相手からは気持ち悪がられると思いますので、やる場合はほどほどに(^^;

ちなみに、転送用PHPは即興で作ったんで、出来の方はかなりアレで何です(笑)

追記 2008/03/10
なんかの置換ミスで全箇所Rerererって書いてある超間抜け状態だったので、それの修正ついでで全面改定しました(^^;

Posted by Takuchan at 2004年02月24日 15:06 | トラックバック(0)