perl、phpとアクセスランキングについて質問です。


・a hrefで普通に来た1カウント
・iframe srcで不正に来た1カウント

区別する方法はありますか?
困っています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/10/22 13:55:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:GoldenDawn No.1

回答回数426ベストアンサー獲得回数81

ポイント20pt

インチキしようと思えばいくらでもできますが、アンカーの方にフラグメント識別子をつけて飛んで来たときに有無を調べるとか。

<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%...

id:freewriter

そうですよねー。。

で、iframeでもフラグメント識別子は付けられますよね?

iframeだとリファラってどうなるんでしたっけ

2008/10/15 15:28:46
id:SZK40135 No.2

回答回数2ベストアンサー獲得回数0

ポイント20pt

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...

id:freewriter

ありがとうございます。

target属性が指定されてないといけないなら、汎用的に使うのは難しそうですね。

表示回数とクリック数を比較して、クリック率の高低で判別するしかないかな。

2008/10/16 01:44:15
id:SZK40135 No.3

回答回数2ベストアンサー獲得回数0

ポイント20pt

単純な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...

id:freewriter

すいません、正規表現ちょっとわからないんですが、

・リファラでリンク元URLを得る

・file_get_contentsで、そのURLの中にiframe src=http://hogeがないかチェックする

という意味ですよね?これは面白いですね。ありがとうございます。

2008/10/18 17:29:52
id:Knoa No.4

回答回数14ベストアンサー獲得回数0

ポイント20pt

JavaScriptのclientWidthを使って、極端に小さな値であればiframeとみなしてよいのではないでしょうか。

http://www.google.co.jp/search?q=clientWidth

id:freewriter

アクセスランキングの話なので、これはちょっと別の話ですよね

2008/10/18 17:32:54
id:Knoa No.5

回答回数14ベストアンサー獲得回数0

ポイント20pt

え?え?え?

超自信満々の回答だったのに(笑)。

たとえば、このURLがランキング集計用のphpファイルだとしますよね?

http://example.jp/ranking.php

んで、

<a href="http://example.jp/ranking.php">アクセスランキング</a>

をたどったアクセスはカウントしたいけど、

<iframe src="http://example.jp/ranking.php" width="1" height="1">アクセスランキング</iframe >

からのアクセスはカウントしたくないって話ですよね?

http://example.jp/ranking.php

でJavaScriptのclientWidthを使えば、上記iframeの場合だけ、clientWidthが1になるはずです。通常のhrefからのアクセスであれば、ブラウザ内の横幅なので700-1000くらいの値が一般的でしょう。なので、たとえば「clientWidthとclientHeightがいずれも200未満ならiframeとみなす」とかがおすすめです。それなりの大きさにしないと、大きめのiframeを作られたらダメなので。ケータイ端末からのアクセスを考慮なくていいなら、もっと大きくてもいいもしれません。

で、ここからが肝心なのですが、

http://example.jp/ranking.php

へのアクセスを受けとったら、Ajaxなりを使って、その場で

http://example.jp/ranking_counter.php

などのファイルと通信させて、正しいアクセスの場合のみを記録するようにします。

正しいかどうかは、もちろん先ほどのclientWidthによる判断を利用します。

また、不正防止のために、

http://example.jp/ranking_counter.php

に直接アクセスされてもカウントしないような工夫が必要です。


以上ですが、

「perl/phpだっつってんだろ!Ajaxなんて知るか!」という場合はポイントいりません。

でも、とりあえず「アクセスランキングと別の話」という誤解が解けたらうれしいです。

id:freewriter

すいません不勉強なもので。。

ajaxよく分かりませんがお話は分かりました。

遷移する前のページのウィンドウサイズを取得できるんですね。

返答を最初見たとき、今表示しているページのサイズしか取れないと思っていたので

上記のようなお返事をしてしまった次第です。大変失礼しました。

勉強します。

ご丁寧にありがとうございました!

2008/10/20 02:50:19
  • id:Knoa
    Ajaxを勉強されると分かると思いますが、

    > 遷移する前のページのウィンドウサイズを取得
    は、たぶんちょっと誤解があるように思います。

    「今表示しているページ(ranking.php)のサイズ」を取得した上で、その取得した数値をranking_counter.phpに自動的に送りつけるためにAjaxを使います。
  • id:freewriter
    なるほど、勉強します。ありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません