いたずら防止のためのプログラムを作ったのですが動きません。

[上に] [前に] [次に]
じゃじゃまるっこ 1999/07/21(水) 18:41:16
Perl初心者です。毎回アクセスしてくるIPをすべてファイルに保存して、訪問してきたIPがそのファイルのなかのIPと何回マッチしたか(つまりそのIPの今までの訪問回数)を調べて、20回以上の訪問があれば強制終了させるというプログラムを作ったのですが、動きません…。私なりに頑張ったつもりですが、どうか助けてください。どこがいけないのでしょうか。Windowsでやってます。
$addr = $ENV{'REMOTE_ADDR'};
$bad_count = 0;
open (IPIN,">>$get_ip");
print IPIN "$k:$addr\n";   #$Kはほかで計算しているカウントです
close(IPIN);

open(GET_IP,"$get_ip");
while(<GET_IP>){
    while(/^\d:$\n/){
($no,$ip) = split(/:/);
             %ip_list{$no} = $ip;
                for $ip_list (@no) {
                    if($ip_list eq $addr) { $bad_count++; }
                }
       if($bad_count > 20){
                   &CgiError("非常事態!入力エラー発生!!!!");
                    exit;
}  }  }

B-Cus 1999/07/21(水) 18:52:28
> 動きません…。
動かないとは? サーバエラー? 20回以上アクセスしても弾けない?

> print IPIN "$k:$addr\n"; #$Kはほかで計算しているカウントです
$kってのは何? その$addrの訪問回数? なら、ファイル中に
 2:10.0.0.1
 5:10.0.0.1
などと同じエントリが重複することはないわけね? だとしたら以下のコードで
どうでしょう。

open(GET_IP,"$get_ip");
while(<GET_IP>){
 if (/^\d+:$/){
  ($no,$ip) = split(/:/);
  $ip_list{$ip} = $no;
 }
}
if( $ip_list{$addr} > 20 ){
 &CgiError("非常事態!入力エラー発生!!!!");
 exit;
}

実際に動かしてません。動作の保証はしません。そのつもりで。

じゃじゃまるっこ 1999/07/22(木) 08:54:46
さっそくお返事ありがどうございます。エラーが出るっていうのは、(アンケートCGIを作っているのですが)submitボタンを押して送ってもIEで、"ページが表示されません"なんて出てきて、にっちもさっちもいかない状態ばかりです。Netscapeでもそうです。B-Cus さんのプログラムを試してみたのですが、やはりうまくいきません。ちなみに、$kはそのページにデータを入れてくれた全ての訪問者数を、前のルーチンでカウントしたものです。ですからファイルには
  1:10.0.0.6
 2:10.0.0.1
  3:10.0.0.7
  4:10.0.0.6
 5:10.0.0.1
なんてこともあり、上の例だと10.0.0.1が2回訪問してきているので、あと18回きたらexitさせる、というプログラムなのです。
うーーむ。うまく説明できたかどうか…(+_+)

[上に] [前に] [次に]