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 っているのかな。自信ないです。

参考

僕は昔から、METAタグのRefreshでリファラを隠す派ですが、これ見ても大丈夫そう。
昔は、リファラが空だったらしいけど、最近のブラウザは多分、踏み台ページが残るのが主流な気がする。(試してないけど)