FirefoxでHTTP_REFERERの送信を止める、又は偽装する

Read More

HTTPリファラとは、ユーザがあるページを開いた時、
(サーバ側から見た状態で)どのページからのリクエストなのかがわかるURLのことを指す。

ブラウザがサーバに対してページリクエストを行うとき、HTTPリファラヘッダも一緒に送信されているのだ。


一言で言うとリンク元ページのURLが取れる


HTTPリファラはアクセス解析に利用するのが一般的な使い方だが、
if文での判定やリダイレクトにHTTPリファラを使ったりなどすることがまれにある。

しかしこれは本来褒められた使い方でない。


それは、HTTPリファラは必ずしも送信される値ではないからだ。


リファラ送信を止めることもできるし、
リファラ内容を偽装することもできる。


外部からの影響を受けにくい「閉鎖された環境」である場合においては有効な方法かもしれないが、
一般に公開しているようなサイトではHTTPリファラの値を判定やリダイレクトに利用すべきではない。



さて、以下は実際にHTTPリファラの送信を止める、或いは偽装する為の方法。


■Firefoxでリファラ送信を止める_その1
ページにダイレクトアクセス。

1.アドレスバーに表示したいURLを入力し決定する。

これがもっとも簡単な方法。
別にFirefoxでなくとも有効。



■Firefoxでリファラ送信を止める_その2
about:configの設定値を変更する。

1.アドレスバーに about:config と入力する。
2.検索バーに network.http.sendRefererHeader と入力する。
3.値が2 となっているのを0に変更する。

ただしこれだと常にリファラ送信を止めているのでサイトによっては不具合が起こる。

ちなみにnetwork.http.sendRefererHeaderの値は0、1、2とあり、
0はリファラを送らない。
1はリンクをクリックした場合リファラを送る。
2は1にプラスしてイメージをロードする時もリファラを送る(デフォルト)。

network.http.sendRefererHeaderの詳細はこちら(英文)↓
http://kb.mozillazine.org/Network.http.sendRefererHeader



■Firefoxでリファラ送信を止める、リファラ内容を偽装する。
Firefoxアドオンを利用する。

1.RefControlアドオンをインストール。
2.アドオンマネージャからRefControlの設定画面を呼び出し任意の設定をかます。

・RefControlアドオン
https://addons.mozilla.org/ja/firefox/addon/refcontrol/

RefControlの設定は説明不要なレベル。
唯一、第三者要求という聞きなれない設定があるが、これはドメインの違うサイトからのアクセスのこと。

例えば、以下のような設定をした場合
サイト:localhost
動作:阻止
第三者要求のみにチェックを入れる


こうするとlocalhostからlocalhostに遷移している時はリファラの送信がされる。
しかしIPアドレス(例えば192.168.1.50)からlocalhostへ遷移する時はリファラの送信を抑制する。




さてここまででHTTPリファラは送信を止めたり偽装することのできる値だということがわかった。


さらにdocomoの一部の機種では最初からHTTPリファラ情報を送信しないものがあるらしい。
これについては実機に関しては未確認だが、iモードHTMLシミュレータIIでは確かにHTTPリファラは送信されていないことが確認できた。

つまりdocomoの仕様であると言える。


モバイル向けに作っているサイトでHTTPリファラをアクセスログ以外の用途に使っている場合は早急にこの辺を見直す必要がある。




さて、そうするとHTTPリファラを利用せずに同様の値を取得するにはどうしたらよいだろうか?

ぱっと思いつくのは、
リクエストパラメータにそのページ自体の情報を持たす方法。


仮にリンク元ページのURLがhttp://example/hoge.htmlとする。
リンク先ページのURLはhttp://example/piyo.htmlとしよう。


■HTTPリファラと同様の値を取得する
<a href="http://example/piyo.html?referer=hoge.html">リンク</a>

あるいは
<a href="http://example/piyo.html?referer=http%3A%2F%2Fexample%2Fhoge.html">リンク</a>

# refererの値はURLエンコードをかますこと。


こうしておけばページ先でHTTPリファラの代わりに$_GET['referer']で同様の値が取れる。

リンクのリクエストパラメータにURLが直に見えてしまうことに抵抗がある人は暗号化してもよい。
ただしこの場合プログラム側で復号化する必要がある。


このようにすればHTTPリファラと同様の値が取得できるが、こちらでも値を改変される恐れはある。
やはり安易に利用することはできない。

例えば別ページへの誘導にひっかかったりすることもあり得る。
最悪なパターンだとデータを抜かれたりなどもあり得る。


なのできちんと値が送られているかどうか、正しいドメインかどうかなどのチェックは必ず必要になってくる。


この辺りはHTTPリファラの値も同様だが、先述したようにdocomoではHTTPリファラが送信されないものがある。
あちらはそれがある以上そもそも使えない。




まあこちらはこちらで本気でやるとなると色々大変そうだ。