リファラーは信頼できるか
サービスページ毎に掲示板を設置するに当り、設置したページを分別するためにリファラーを利用する実装を試みました。その実装の有効性を調査してみました。
サービスを提供していますと、ユーザの声のフィードバックを受けたくなります。不具合などもエラーログで確認できる以外にも発生しているに違いありません。このように考えて、サービスのページにQA掲示板を設置することにしました。ページに埋め込みで、軽く作りたかったため、クライアント側をAjax/Javascript、サーバ側をCGIと想定しました。
背景
ネットを漁り、lebhaft Ajaxの一行掲示板というBBSソフトが想定に合致しました。利用に制限がないし素晴しいものです。しかし若干の改造が必要です。これは一つの掲示板を管理するソフトウェアですが、私の利用では、各サービス毎に掲示板を設置します。簡単にするために、インストールは1つで、コードを共有できるようにと考えました。要するに、設置したページ毎にデータベース(この掲示板ではファイル)を分けることになり、サーバではリクエスト毎に設置したページを知る必要があります。
前置きが長くなりましたが、このページを見分けを実現するために、2つの方法を考えました。
- リファラーを使う。
- cgiパラメタにページのURLを追加する。
(2)はリクエスト側、CGI側の双方にパラメタの追加を行う実装になり、(1)の場合CGI側だけの追加になりクライアント側は自動で付加されますので、Ajaxのリクエストを変更する必要がありません。
ブラウザによるリファラーの対応の違い
さて、(2)の実装は問題ないとして、(1)で実装する場合、リファラーは信頼できるのでしょうか、いつも送られて来るのでしょうか。PCではあまり話題に上りませんが、携帯電話などではリファラ送信不可の設定がデフォルトだったりします。また、私のブログでは画像取得時のリファラの変更なども扱ってきました。皆、平気で設定を変えているのではないでしょうか。
ブラウザ | リファラを出さない設定 | リファラを指定する設定 | その他 |
Internet Explorer | なし | なし | Fiddlerというツールを使うと可能 |
firefox | network.http.sendRefererHeader 0: 出さない 1: インライン要素の場合出さない 2: いつも送出 | なし | デフォルトは2 |
opera | ツール→詳細設定→ネットワーク リファラーを送信する Y/N | なし | デフォルトは送信 |
w3m | ネットワークの設定→Referer: を送らないようにする Y/N | なし | デフォルトは送信 |
wget | なし | --referer=URL | デフォルトは送信しない |
aria2c | なし | --referer=REFERER | デフォルトは送信しない |
基本的には、インタラクティブなHTTPクライアントはデフォルト送信し、バッチなものは送信しません。インターネットエクスプローラは通常の方法ではリファラを止めることはできませんので安心です。しかし、firefoxとoperaは止められるので完全には信頼できないことが分ります。なお、バッチのwgetもaria2cもどちらも、自由にリファラを付けることができます(そもそもクライアントは何を指定すべきか分りませんので)。しかしこれらは一般的ではないので考慮しなくて良いでしょう。
結論としては、firefox (とopera)でリファラを止めている人の割合の統計データを確認できるまでは、当てにできない、ということになります。今回は、安全のために、CGIは(1)(2)の両対応とし、クライアント側はページURLを送る(2)の実装にしました。