人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: にらたま
●カテゴリ:インターネット ウェブ制作
✍キーワード:href Perl PHP SRC アクセス
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● GoldenDawn
●20ポイント

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

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

◎質問者からの返答

そうですよねー。。

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

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


2 ● SZK40135
●20ポイント

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属性が指定されてないといけないなら、汎用的に使うのは難しそうですね。

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


3 ● SZK40135
●20ポイント

単純な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がないかチェックする

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


4 ● Knoa
●20ポイント

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

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

◎質問者からの返答

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


5 ● Knoa
●20ポイント

え?え?え?

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

たとえば、この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なんて知るか!」という場合はポイントいりません。

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

◎質問者からの返答

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

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

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

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

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

勉強します。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ