- ベストアンサー
アクセスカウンタの複数カウント防止策
アクセスカウンタの複数カウント防止策となるようなCGIのソースを教えていただけますか。 lockファイルを作るのではなく、CGI本体にいれたいのです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>ネットサーフレスキューのWebアナライザーというスクリプトを使っているのです。 >相手のOSとか様々なことを調べられて便利なのですが、唯一、更新ボタンを連続し >て押して、多重カウントを取り、キリ番(キリのいい番号を踏んだ人の名前をのせる) >と名乗る人が現れ始めたのです。 とのことなので、Web アナライザを見てみました。 で、このスクリプトでは、REMOTE_HOST とアクセス時間を1時間単位で取得記録し 1日毎にログファイルを作っています。 そこで、今のアクセスが1時間以内の時はログ記録をしないようにしてやれば良い訳です。 ただし、この方法は違うユーザーでも、同じサーバを使って1時間以内にアクセスしてきた 場合もはじいてしまうという欠点があります。 (HTTP_REFERER だとリロードされた時(更新ボタンを押したとき)には、リファーが消えて しまいどこから来たのか判別できなくなります。また Cookie はブラウザが受け付けない 設定になっている場合や、一部のブラウザでは、使えないのです。) で、log.cgi の 77~90行目でログ記録をしているので、その前にログチェックいれて やります。実際のスクリプトは以下のようになります。 #-----------------------------------ここから------------------------------------ # ログの読み込み open(LOG,$log) @lines = <LOG>; close(LOG); #スキップフラグをまずoffにする $log_skip = 0; # ログチェック foreach $data (@lines) { chop($data); ($LOG_HOUR,$LOG_HTTP_REFERER,$LOG_REMOTE_HOST,$LOG_HTTP_USER_AGENT,$LOG_OS) = split(/\t/,$data); if(($LOG_REMOTE_HOST eq $REMOTE_HOST) && ($HOUR eq $LOG_HOUR)) { # もし、そのユーザのアクセスしてきたサーバと時間が一致したら、 # スキップフラグをonにしてループを抜ける。 $log_skip = 1; last; } } #スキップフラグがonでなければログ記録 if($log_skip != 1) { #ここからが、77行目~90行目 if (open(LOG,">> $log")) { print LOG "$HOUR\t$HTTP_REFERER\t$REMOTE_HOST\t$HTTP_USER_AGENT\t$OS\n"; close(LOG); chmod 0666,$log; } if (open(LOG,">> $log_file")) { print LOG "\n"; close(LOG); } #ここまでが、77行目~90行目 } #-----------------------------------ここまで------------------------------------ となります。 たぶんこれで大丈夫だと思いますが、もし何かあったら k-ji@mail.goo.ne.jp がgooでの私のメールアドレスなのでここにメールしてもらえれば相談に乗りますね。
その他の回答 (4)
- ykc
- ベストアンサー率29% (28/95)
一番簡簡単なのは、Cookieを利用することでしょうか。 if($ENV{'HTTP_COOKIE'}){ exit; } else{ print "Set-Cookie:~ } Cookieをチェックして、なければREMOTE_ADDRのチェックをするのがいいでしょう。
それからもう1つ。 環境変数HTTP_REFERERの内容を見て、自分のサイト内から飛んできたユーザーである場合にはカウントしない、という方法もあります。 ただしこの変数は、プロバイダの方針などによって変なアドレスを指していることもあるので、あらかじめ正しく動作するかテストする必要があります。
- cocky
- ベストアンサー率57% (232/402)
単純なのは、アクセスカウンタの記録ファイルにカウント数だけでなくREMOTE_ADDRのデータも一緒に記録してしまい、次回アクセス時にそれを照合する方法ですね。 ソースはその辺に転がっているフリーのアクセスカウンタを見れば簡単だと思いますが。 私も自作のアクセスカウンタ公開してますんで、参考にされるならどうぞ。(URLは下記) ただlockファイルを作らない場合、OS側のlock機構がしっかりしていないとカウントデータが飛ぶ場合がよくあります。 OSにflockが付いていても飛ぶときは飛びますから(笑)、私の場合はflockとrenameロックの二重ロックにしてます。
- k-ji
- ベストアンサー率57% (11/19)
元の、カウンタがどのようなことを記録して、どのような処理をしているか 分からないと組み込むことが出来るようなスクリプトは提示できません、 すみません。 で、通常ロックを使わずに複数カウントをしないようにするには、 アクセスしてきた人のアドレスとアクセス時刻をログに記録し、その記録から 1~5分以内に(時間はカウンタを使う人の考えによります)同じアドレスからの カウントはしない。という事をします。 アクセスしてきた人のアドレスの取得するサブルーチンは以下の通りですので、 参考にしてください。 このルーチンはサーバがドメイン名の逆引きをサポートしていれば生IPでなく ドメイン名を取得できますのでログ記録すればどこから来た人が多いのかなどの 統計処理にも使えます。 sub domain_name { my($addr) = $ENV{'REMOTE_ADDR'}; my($h_adr) = gethostbyaddr(pack("C4",split(/\./,$addr)),2); if ($h_adr ne '') { } else { if (/.+\.(.+)\.(.+)\.(.+)$/) { $h_adr = "\*\.$1\.$2\.$3"; } elsif (/.+\.(.+)\.(.+)$/) { $h_adr = "\*\.$1\.$2"; } elsif (/.+\.(.+)$/) { $h_adr = "\*\.$1"; } else { $h_adr = "on the internet"; } } $h_adr; }
補足
専門家の方が答えてくださって、大変心強く思っています。 私は、CGIは他作のものをダウンロードして、手を加えたりして使う派なのです。 で、今回は、ネットサーフレスキューのWebアナライザーというスクリプトを使っているのです。相手のOSとか様々なことを調べられて便利なのですが、唯一、更新ボタンを連続して押して、多重カウントを取り、キリ番(キリのいい番号を踏んだ人の名前をのせる)と名乗る人が現れ始めたのです。 大変申し訳ないのですが、このスクリプトの場合、どのような感じでどこら辺に書けばいいのか教えてください。よろしくお願いします。