・a hrefで普通に来た1カウント
・iframe srcで不正に来た1カウント
区別する方法はありますか?
困っています。
インチキしようと思えばいくらでもできますが、アンカーの方にフラグメント識別子をつけて飛んで来たときに有無を調べるとか。
<a href="http://example.com/hoge.html#top">ほげ</a>
http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%B0%A5%E1%A5%F3%A5%...
hrefのリンクとiframeのソースでPHPを開いたときの、$_SERVERを比較してみました。フラグメント識別子は$_SERVERの値に現れませんでした。また、hrefでもiframeでもHTTP_REFERERの値は全く同じでした。
ただ、両者で違う部分をみつけました。それはHTTP_ACCEPTの値でした。
私の環境では、hrefから開いたときのHTTP_ACCEPTは
["HTTP_ACCEPT"]=> string(3) "*/*"
で、iframeから開いたときのHTTP_ACCEPTは
["HTTP_ACCEPT"]=> string(164) "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*"
になっていました。
なぜそうなのか、どの環境からアクセスしたときも違いが出るのか、は分かりませんが、なにかの区別ができそうな雰囲気です。ただし、この違いはhrefからのリンクが別画面で開くときだけでしたので、target属性が指定されていないとダメなようです。
ダミーURLですみません
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8...
ありがとうございます。
target属性が指定されてないといけないなら、汎用的に使うのは難しそうですね。
表示回数とクリック数を比較して、クリック率の高低で判別するしかないかな。
単純なiframeを防ぐなら、以下のPHPでできました。
(しつこくてすみません、同じ悩みを持っていたので・・・)
<? if(preg_match('/<iframe.*src\s*=\s*["|\']'.str_replace('/','\/','http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).'["|\']/i',@file_get_contents($_SERVER["HTTP_REFERER"],true))){ echo "NG"; } else { echo "OK"; } ?>
リファラー元に自分のURLをsrcに持ったiframeタグがないか調べています。
これでもちょっと頭を使ったインチキは防げないですね。
私も完璧に見分ける方法があれば、知りたいです。
ダミーURLですみません
http://www.google.co.jp/search?hl=ja&q=file_get_contents&btnG=%E...
すいません、正規表現ちょっとわからないんですが、
・リファラでリンク元URLを得る
・file_get_contentsで、そのURLの中にiframe src=http://hogeがないかチェックする
という意味ですよね?これは面白いですね。ありがとうございます。
JavaScriptのclientWidthを使って、極端に小さな値であればiframeとみなしてよいのではないでしょうか。
アクセスランキングの話なので、これはちょっと別の話ですよね
え?え?え?
超自信満々の回答だったのに(笑)。
たとえば、このURLがランキング集計用のphpファイルだとしますよね?
んで、
<a href="http://example.jp/ranking.php">アクセスランキング</a>
をたどったアクセスはカウントしたいけど、
<iframe src="http://example.jp/ranking.php" width="1" height="1">アクセスランキング</iframe >
からのアクセスはカウントしたくないって話ですよね?
でJavaScriptのclientWidthを使えば、上記iframeの場合だけ、clientWidthが1になるはずです。通常のhrefからのアクセスであれば、ブラウザ内の横幅なので700-1000くらいの値が一般的でしょう。なので、たとえば「clientWidthとclientHeightがいずれも200未満ならiframeとみなす」とかがおすすめです。それなりの大きさにしないと、大きめのiframeを作られたらダメなので。ケータイ端末からのアクセスを考慮なくていいなら、もっと大きくてもいいもしれません。
で、ここからが肝心なのですが、
へのアクセスを受けとったら、Ajaxなりを使って、その場で
http://example.jp/ranking_counter.php
などのファイルと通信させて、正しいアクセスの場合のみを記録するようにします。
正しいかどうかは、もちろん先ほどのclientWidthによる判断を利用します。
また、不正防止のために、
http://example.jp/ranking_counter.php
に直接アクセスされてもカウントしないような工夫が必要です。
以上ですが、
「perl/phpだっつってんだろ!Ajaxなんて知るか!」という場合はポイントいりません。
でも、とりあえず「アクセスランキングと別の話」という誤解が解けたらうれしいです。
すいません不勉強なもので。。
ajaxよく分かりませんがお話は分かりました。
遷移する前のページのウィンドウサイズを取得できるんですね。
返答を最初見たとき、今表示しているページのサイズしか取れないと思っていたので
上記のようなお返事をしてしまった次第です。大変失礼しました。
勉強します。
ご丁寧にありがとうございました!
そうですよねー。。
で、iframeでもフラグメント識別子は付けられますよね?
iframeだとリファラってどうなるんでしたっけ