CGI-BBS > 基本認証 > その他 > アクセス数の制限が出きる方法があったら教えてください。


カレッヂ
カレッヂ


データ復旧、即日 データ¨復旧¨テラステーション¨修理

質問者 柴崎  投稿日 6/18(月) 19:53:28
例えば、CGIプログラムが1000回実行されると翌日まで
エラーメッセージを表示して
アクセス出来ないようにするような方法は無いでしょうか?

よろしくお願いします。
回答者 呑兵衛  [削除]  投稿日 6/21(木) 01:00:30
呑兵衛と言います。
こんなのどうですか。

午前0時までの24時間制限方法です。
24時間経過したファイルは自動的に削除されます。
何時に開始し、何時までの制限にするかは timeの+−で加減してください。

#!/usr/local/bin/perl の行に続けて書きます
#----------------------------------------------------------------------------------------
$url = 'http://限度以降のhtml';
$giveup = 0;

# 海外での設置は下の時差時間との合計が絶対値で24になるよう調整します
# 時差が 9時間であれば -15*60*60になります
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time -24*60*60);
$del_file = sprintf("%04d%02d%02d", $year +1900, $mon +1, $mday);
if (-e $del_file) { unlink($del_file); }

# 海外での設置は timeのところを time +時差*60*60とします
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$chk_file = sprintf("%04d%02d%02d", $year +1900, $mon +1, $mday);

# この cgi が呼び出されたときの最初のファイルを生成します
if (!-e $chk_file) {
        open(CHECK, "> $chk_file") || &error('error');
                print CHECK "0\n";
        close(CHECK);
}

# 呼び出されれば数値を1加え、1000回を超えればフラグを立てます
open(CHECK, "$chk_file") || &error('error');
        while (<CHECK>) {
                chomp;
                $bye_count = $_ +1;
                if ($bye_count >= 1000) { $giveup = 1; }
        }
close(CHECK);

# 読み込んだ数値が1000以内ならば新しい数値を記録します
if ($count <= 1000) {
        open(CHECK, "> $chk_file") || &error('error');
                print CHECK "$bye_count\n";
        close(CHECK);
}

# フラグが立っていれば、限度以降のhtmlファイルに飛び、この行以降のスクリプトを中止します
if ($giveup == 1) { print "Location: $url\n\n"; }
#----------------------------------------------------------------------------------------
ここより以下に制限したいファイルのスクリプトを続けます。

注意
rescue さんのスクリプトで、イメージファイルが配列で処理されている(例: Newなど)
cgi スクリプトは、2度同じスクリプトを実行します(2度カウントされる)ので注意してください。
&error で sub error を呼び出します。スクリプトに合わせて書き換えてください。
質問者 柴崎  [削除]  投稿日 6/21(木) 06:33:04
ありがとうございました。参考にさせて頂きます。
回答者 呑兵衛  [削除]  投稿日 6/21(木) 23:05:40
変更してください。

# 読み込んだ数値が1000以内ならば新しい数値を記録します
if ($count <= 1000) {
のところを

if ($bye_count <= 1000) {


テストは
すべての1000を5とか10にして・・・。

返信(回答)する


データ復旧、即日 データ¨復旧¨テラステーション¨修理 Web裏技