[PHP-users 27783] Re: 賢い HTTP_REFERER ?

個々一番 cocoiti @ comio.info
2005年 12月 7日 (水) 20:50:31 JST


個々一番です。

大雑把ですが概念だけ誤解があるようなので先に示します
以下のような3種類のファイルがあったとします。

http://exsample.com/index.html     //リンク元ファイル
http://exsample.com/index2.html    //リンク先ファイル
http://exsample.com/image.png      //リンク先ファイルのイメージタグにあ
る画像

index.htmlから、index2.htmlに飛ぶ時にブラウザからリファラ情報が
送られます。
ブラウザは、index2.htmlの情報を解析し、イメージタグがあるので
image.pngを読み出します。この時のブラウザから送出されるリファラは
index2.htmlです。

これはブラウザで意図的に弄るかバグが無い限り基本的には変わりません。

その上で解決方法としては、
齊藤さんのおっしゃるように
index2.htmlでJavascirptを使いimage.pngにindex2.htmlに送出されたはずの
リファラをクライアントサイドから送信する。
という方法があります。
これは、いわゆるレンタルのアクセスカウンタではほとんどこの方法で
データを取得しています。
image.pngで、サーバサイドに送られてくるリファラ関係情報は、世間一般の
ブラウザでは、index2.htmlしかありません。

さて以下の件ですが。
> http://www.kent-web.com/count/cherry.html
> で説明されているカウンタとログの仕組み。
> これは perl で書かれていますが、ソースで
> 	# リンク元URLを取得
> 	$ref = $ENV{'HTTP_REFERER'};
> 	$ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
これは、仮に
http://exsample.com/index2.html   //本来のリンク元ファイル
http://exsample.jp/index2.html    //不正なリンク元ファイル
という2種類のURLがあるときに、http://exsample.jp/index2.htmlをはじくため
の設定です。
いわゆるいたずら防止です。
Perlにおいてもcount.cgiが受け取れる値は、index2.htmlであり、index.html
ではありえません。

robotを取るのであれば、リファラじゃなくUserAgentとIPアドレスが基本では
ないでしょうか。

ログをとりたいのであれば、Apacheのログを出力するように設定してやれば、
アクセスを拒否してやりたいなら、Apacheのmod_rewriteなどを指定してやれば、
それぞれ対策が取れると思います。

まぁPHP的アプローチ以外もあるというご提案でした。

> # 試せばいいんですね。でも、試して、上記と同じようになったら
> # どうしましょ?なんか、胸の真ん中あたりがむしゃくしゃします。
試してから、質問すればいいのかもしれませんが・・・。
HTTPは、理解しやすい形のプロトコルなので納得できる回答が得られる
ことが多いです。
解決策が往々にしてなかったりするので困りますが。(笑)

以上、ご参考になれば幸いです。

/*************************************
*個々一番
*cocoiti @ comio.info
*************************************/



PHP-users メーリングリストの案内