MediaWiki のリファラ対策
MediaWiki で情報をまとめ始めたけど、リファラが怖いので隠す事にした。
尚、対応バージョンは mediawiki-1.21.3.tar.gz <= これ相当。
これ参考にしたけど、そのまま真似しちゃダメ。普通にリファラ漏れる。 罠です。
とはいえ、僕の対処法もそれほど自信ないので、おかしい所があれば誰か指摘して下さい。
HideReferer
location.href でもリファラは漏れる(Chromeで確認)ので、meta refresh 方式に変更。
あと、$_SERVER['argv'][0] なんてないです。(デバッグ時のコードを書いちゃったとか?)
- /var/www/HideReferer.php
<?php if (isset($_GET['hr_url'])) { $hr_url_encoded = htmlentities($_GET['hr_url']); if (strlen($hr_url_encoded) <= strlen('http:')) { echo "invalid URL ($hr_url_encoded)"; // safe guard for finite loop exit (1); } echo "<html><head><meta http-equiv=\"refresh\" content=\"0;URL=$hr_url_enco\ ded\"></head> <body> goto $hr_url_encoded </body></html>"; } function HideReferer($url) { global $wg_hr_Referer; $newurl = $wg_hr_Referer . "?hr_url=" . $url; return $newurl; }
htmlentities って無条件で使えない記憶があるので、後で見直す。
LocalSettings.php
これはそのまま
$wg_hr_Referer = "http://awm.jp/HideReferer.php"; include("/var/www/HideReferer.php");
Linker.php
Parser.php でなく Linker.php を弄った。
public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) { <略> if ( !$title ) { $title = $wgTitle; } // -- begin -- // $url = HideReferer($url); $url = Sanitizer::decodeCharReferences( $url ); // -- end -- // $attribs['rel'] = Parser::getExternalLinkRel( $url, $title );
多分、これで網羅できると思うけど、意図しないものまで変換しちゃわないか。
あと、Sanitizer っているのかな。自信ないです。