Redmineに投稿されたURLからREFERERを送信しない

OSSのプロジェクト管理ツールである「Redmine」を利用している方も多いと思いますが、デフォルトのままだと投稿されたURLをクリックするとRedmineサーバのFQDNが参照元(REFERER)として相手方サーバに渡されてしまいます。

以下はGoogle Analyticsで「参照サイト」の項目を表示したところですが、数は少ない物の社内RedmineのFQDNと思われるREFERERが渡ってきているのがわかります。

もちろんオープンなプロジェクトであれば問題ないでしょうし、何らかのアクセス制限がされていれば閲覧することはできないのですが、管理者からするとあまり気持ちの良い物ではありませんし、一時的に設定をミスして全公開状態になることも考えられます。

今回はそもそもREFERERを渡さない設定を行います。Redmineにプラグインを入れてちょちょいと設定するだけです。

REFERERを送信しない

原理

細かい説明は端折りますが、話は非常にシンプルで以下のmetaタグをheadタグに追加します。

<meta name="referrer" content="no-referrer">

また念の為、aタグに以下のようなrel属性を追加します。

<a href="http://www.example.com/" rel="noreferrer">漏れないよ!</a>

注意点としては「REFERER」ではなく「REFERRER」とスペルが異なる点でしょうか。最初勘違いしてましたw

みんな大好きCan I useによると90%程度の実装率のようですね。

詳細はW3Cにドキュメントがありますので気になる方は参照してみてください。 w3c.github.io

プラグインの導入

「Redmine view customize plugin」をインストールします。本来はRedmineの見た目をカスタマイズするためのプラグインなのですが、早い話が指定したJavaScriptを指定したページに埋め込んでくれるという物になるのでこいつを利用します。

github.com

プラグインのインストール方法はドキュメントに書いてある通り。

$ cd {RAILS_ROOT}/plugins
$ git clone https://github.com/onozaty/redmine-view-customize.git view_customize
$ cd ../
$ bundle install --without development test
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production

最後にApacheを環境に合った方法で再起動しておきます。

$ sudo service httpd restart

Redmineの管理ページに表示されればインストール成功です。

プラグインの設定

Redmineの設定に「表示のカスタマイズ」という項目が新たに現れるのでここをクリック。

「新しい表示のカスタマイズ」をクリック。

具体的な設定をする画面が開くので以下のように入力し、最後に「保存」ボタンをクリックすれば完了です。

パスのパターン
.*
挿入位置
全てのページのヘッダ
種別
JavaScript
コード
RedmineにはjQueryが利用されているので、こちらを活用します。
$(function(){
    // metaタグ追加
    $('<meta name="referrer" content="no-referrer">').appendTo('head');

    // 全aタグに属性追加
    $('a').each( function(){
        var rel = $(this).attr('rel');

        if( rel === undefined ){
            rel = 'noreferrer';
        }
        else if( rel !== 'noreferrer' ){
            rel += ' noreferrer';
        }

        $(this).attr('rel', rel);
    });
});
コメント
(わかりやすい文言を入力)
有効
チェックする
private
チェックしない

動作確認

気をつけたいのはブラウザの「ページのソース」を開いてもわかりません。サーバから送られたHTMLではなくロード完了後にJSで書き換えているため、確認するにはブラウザのDeveloperToolを利用する必要があります。

その他の方法

RedmineをSSL対応する

HTTPSからHTTPのサイトにはREFERERを渡さないという仕様が多くのブラウザで実装されていますので、これを利用する手もありますが、HTTPS同士の場合は渡ってしまいます。

昨今、常時SSL化が当たり前な世の中になりましたので、REFERERの送信有無に関わらずSSLには対応しておいた方が良いでしょう。Let's Encryptを利用すれば無料で安全なSSL証明書が利用できますよ!

短縮URLや中間ページ

bit.lyなどの短縮URL(URLの圧縮)サービスを利用すれば隠蔽することはできますが、以下のような欠点があります。

  • 短縮URLサービス自体には漏れる
  • サービスが終了すると地獄
  • Redmine上での検索にヒットしなくなる
  • パッと見どこに遷移するのかクリックするまで不明

同様に「中間ページ」を挟むやり方もありますが、似たような理由であまり積極的な利用はおすすめしません。

合わせてやりたい

blog.katsubemakito.net

動かして学ぶセキュリティ入門講座 (Informatics&IDEA)
岩井 博樹
SBクリエイティブ
売り上げランキング: 11,428