こんにちは!独学プログラマー&ライターのつぶらやです。
突然ですが、webサービスを作ると作ったサービスに人が訪れますが、その人達はどこから訪れてくるのでしょうか。
そのカギを握るのが、リファラというものです。
リファラ?なにそれおいしいの?
という初心者だった私ですが、リファラについて学んできた事をお伝えしたいと思います。
リファラでわかる、君がどこから来たのか
どうやってサービスに来たのか。
どこかのサイト経由で辿り着いたのか、直にurlを知ってアクセスしたのか。
この「どこかのサイト経由」の「どこか」=リファラです。
リファラを知る事ができると、色々とアクセス数を増やす施策を考えたりも出来ます。
早速サンプルプログラムで取得してみましょう。
自分のサービスURLが、http://yyyyy.com/だったとします。
<?php function httpsGet{ $http_referer = $_SERVER['HTTP_REFERER']; var_dump($http_referer); } ?>
結果
http://xxxxx.com/
http://yyyyy.com/にアクセスする前に、http://xxxxx.com/に居たという事が分かりました。
これがリファラの取得方法です。
簡単に取得できましたね。
取得できない事もある?リファラの注意点
簡単に取得できるリファラですが、実は確実なものではありません。
リファラが取得できない場合
リダイレクトをして移動してきた、アプリから移動してきた場合は正しく取得できないと言われています。
また、httpsのサイトからhttpのサイトへ移動してきた場合も取得できません。
この事から、リファラがある事を前提とした機能などは作成するべきではありません。
ただし、リファラによってページの出し分けや、セキュリティの面からリファラを活用する事も出来ますので上手く使い分けることを考えましょう。
リファラが偽装される場合
次の項目でお話しますが、リファラは簡単に偽装されます。
リファラの内容を過信しすぎた機能はやはり作るべきではありません。
自分が思った通りの手順ですべての人が機能を利用してくれるならばいいのですが、悲しい事に悪意を持って来るユーザーもいらっしゃいます。
またURLの中に個人情報のパラメータを入れているとリファラの流出が、重大な個人情報流出にもなり得る時代です。
上記のようなURLがあった場合、ageから年齢、zipから郵便番号が予想できます。
開発者としてリファラの取り扱い、URLの取り扱いには気を付けたいですね。
リファラの書き換え(偽装)はできるの?
リファラをユーザー側からとプログラム側から書き換える方法をお話します。
ユーザー側から書き換える
リファラはユーザー側から以下のようなツールを使用して、簡単に偽装することが出来ます。
参考サイト↓
クロームブラウザのプラグイン Referer Control
FireFoxブラウザのプラグイン Smart Referer
プラグインを使用すれば書き換えだけでなくリファラの送信等について制限もできるようです。
プラグインを入れなくても、ブラウザ側から以前よりは削減されているという話も聞きます。
プログラム側から書き換える
こちらはあまり使用する事はないかもしれませんが、file_get_contentsを使用してサイトから情報を取得してくる場合、リンク元としてリファラを書き換えるサンプルコードの紹介です。
これを動かすとheader情報の中にリファラが入っている事が分かります。
http://yyyyy.com/が、情報を取得しようとしているサイトです。
リファラはhttp://xxxxx.com/に書き換えます。
$referer = "http://xxxxx.com/"; $opts = array( // 書き換える情報をまとめる 'http' => array( 'method' => "GET", 'header' => "Referer: ". $referer; ) ); $context = stream_context_create($opts); $uri = 'http://yyyyy.com/'; file_get_contents($uri, false, $context); // http://yyyyy.com/の情報を取得
上記の例だと、http://yyyyy.com/に対してのリファラにhttp://xxxxx.com/を設定することが出来ました。
file_get_contentsの使用方法については以下を参考にしてください。
まとめ
リファラ(referer)。
取り扱いについては、色々と気を付けなければいけないものです。
開発時にはくれぐれも、URLに個人情報などのパラメータを持つという事はしないようにしましょう。
それでは、また。