-PR-
解決済み

アクセスカウンタの複数カウント防止策

  • 暇なときにでも
  • 質問No.51171
  • 閲覧数187
  • ありがとう数0
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 11% (3/26)

アクセスカウンタの複数カウント防止策となるようなCGIのソースを教えていただけますか。
lockファイルを作るのではなく、CGI本体にいれたいのです。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル8

ベストアンサー率 57% (11/19)

>ネットサーフレスキューの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での私のメールアドレスなのでここにメールしてもらえれば相談に乗りますね。
関連するQ&A
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル8

ベストアンサー率 57% (11/19)

元の、カウンタがどのようなことを記録して、どのような処理をしているか 分からないと組み込むことが出来るようなスクリプトは提示できません、 すみません。 で、通常ロックを使わずに複数カウントをしないようにするには、 アクセスしてきた人のアドレスとアクセス時刻をログに記録し、その記録から 1~5分以内に(時間はカウンタを使う人の考えによります)同じアドレスからの カウントはしない。という事をし ...続きを読む
元の、カウンタがどのようなことを記録して、どのような処理をしているか
分からないと組み込むことが出来るようなスクリプトは提示できません、
すみません。

で、通常ロックを使わずに複数カウントをしないようにするには、
アクセスしてきた人のアドレスとアクセス時刻をログに記録し、その記録から
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;
}
補足コメント
mri

お礼率 11% (3/26)

専門家の方が答えてくださって、大変心強く思っています。
私は、CGIは他作のものをダウンロードして、手を加えたりして使う派なのです。
で、今回は、ネットサーフレスキューのWebアナライザーというスクリプトを使っているのです。相手のOSとか様々なことを調べられて便利なのですが、唯一、更新ボタンを連続して押して、多重カウントを取り、キリ番(キリのいい番号を踏んだ人の名前をのせる)と名乗る人が現れ始めたのです。
大変申し訳ないのですが、このスクリプトの場合、どのような感じでどこら辺に書けばいいのか教えてください。よろしくお願いします。
投稿日時 - 2001-03-15 23:13:22
  • 回答No.2
レベル12

ベストアンサー率 57% (232/402)

単純なのは、アクセスカウンタの記録ファイルにカウント数だけでなくREMOTE_ADDRのデータも一緒に記録してしまい、次回アクセス時にそれを照合する方法ですね。 ソースはその辺に転がっているフリーのアクセスカウンタを見れば簡単だと思いますが。 私も自作のアクセスカウンタ公開してますんで、参考にされるならどうぞ。(URLは下記) ただlockファイルを作らない場合、OS側のlock機構がしっかりし ...続きを読む
単純なのは、アクセスカウンタの記録ファイルにカウント数だけでなくREMOTE_ADDRのデータも一緒に記録してしまい、次回アクセス時にそれを照合する方法ですね。
ソースはその辺に転がっているフリーのアクセスカウンタを見れば簡単だと思いますが。
私も自作のアクセスカウンタ公開してますんで、参考にされるならどうぞ。(URLは下記)

ただlockファイルを作らない場合、OS側のlock機構がしっかりしていないとカウントデータが飛ぶ場合がよくあります。
OSにflockが付いていても飛ぶときは飛びますから(笑)、私の場合はflockとrenameロックの二重ロックにしてます。
  • 回答No.3

 それからもう1つ。  環境変数HTTP_REFERERの内容を見て、自分のサイト内から飛んできたユーザーである場合にはカウントしない、という方法もあります。  ただしこの変数は、プロバイダの方針などによって変なアドレスを指していることもあるので、あらかじめ正しく動作するかテストする必要があります。
 それからもう1つ。
 環境変数HTTP_REFERERの内容を見て、自分のサイト内から飛んできたユーザーである場合にはカウントしない、という方法もあります。

 ただしこの変数は、プロバイダの方針などによって変なアドレスを指していることもあるので、あらかじめ正しく動作するかテストする必要があります。
  • 回答No.4
レベル9

ベストアンサー率 29% (28/95)

一番簡簡単なのは、Cookieを利用することでしょうか。 if($ENV{'HTTP_COOKIE'}){ exit; } else{ print "Set-Cookie:~ } Cookieをチェックして、なければREMOTE_ADDRのチェックをするのがいいでしょう。
一番簡簡単なのは、Cookieを利用することでしょうか。

if($ENV{'HTTP_COOKIE'}){
exit;
}
else{
print "Set-Cookie:~
}

Cookieをチェックして、なければREMOTE_ADDRのチェックをするのがいいでしょう。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ