#!/usr/bin/perl
require './gifcat.pl';
## -------------------------------------------------------------------
$MKNAME = "";
$MKURL = "";
## -------------------------------------------------------------------
$CGIFILE = "./ecocount.cgi"; # このファイルの名前
$MGRPASS = "1111"; # 管理パスワード
$LOGFILE = "./ecocntlog."; # ログファイル名
$LOCKFILE = "./ecocnt.lck"; # ロックファイル名
$GIF_PATH = "./"; # gif画像のあるディレクトリのパス
$BASE_URL = "http://www.ecopac.co.jp/"; # 貴方のベースURL
$ref_url = $ENV{'HTTP_REFERER'};
$cook = $ENV{'HTTP_COOKIE'};
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $form, $ENV{'CONTENT_LENGTH'});
} else {
$form = $ENV{'QUERY_STRING'};
}
@para = split(/&/,$form);
foreach $pair (@para){
($Name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$Name} = $value;
}
$FIG = $FORM{'fig'};
$ID = $FORM{'id'};
$MODE = $FORM{'mode'};
$PASS = $FORM{'pass'};
$ACT = $FORM{'act'};
$NAME = $FORM{'name'};
$COUNT= $FORM{'count'};
# 引数がなければディフォルト
if ($FIG eq "") { $FIG = 5; }
if ($ID eq "") { $ID = 1; }
@para = split(/;/,$cook);
foreach $pair (@para){
($Name, $value) = split(/=/, $pair);
$Name =~ s/ //g;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$COOK{$Name} = $value;
}
$OFFCNTM = $COOK{'minocntM'};
foreach $id ( split(/,/,$OFFCNTM) ) {
if ( $ID eq $id ) {
$UP = 'OFF';
last;
}
}
$OFFCNT = $COOK{'minocnt'};
foreach $id ( split(/,/,$OFFCNT) ) {
if ( $ID eq $id ) {
$UP = 'OFF';
last;
}
}
if ( $UP ne 'OFF' ) { $UP = 'ON'; }
## -------------------------------------------------------------------
## モードにより処理
## -------------------------------------------------------------------
if ( $MODE eq '' ) { # 管理操作以外だったらカウンタ表示
&CountDisp;
} else { # 管理だったら管理処理
if ( $PASS ne $MGRPASS ) { &InputPass; } # パスワードが違う場合
elsif ( $ACT eq '' ) { &DispMgr; } # パスワードOK初期画面
elsif ( $ACT eq '編集' ) { &Conf; } # パスワードOK操作確認画面
elsif ( $ACT eq 'リセット' ) { &Conf; } # パスワードOK操作確認画面
elsif ( $ACT eq '削除' ) { &Conf; } # パスワードOK操作確認画面
elsif ( $ACT eq '回避OFF' ) { &Conf; } # パスワードOK操作確認画面
elsif ( $ACT eq '回避ON' ) { &Conf; } # パスワードOK操作確認画面
elsif ( $ACT eq 'OK' ) { &ExecOper; } # パスワードOK操作実行
elsif ( $ACT eq 'NG' ) { &DispMgr; } # パスワードOK初期画面
}
exit;
## -------------------------------------------------------------------
## カウンター表示処理サブルーチン
## -------------------------------------------------------------------
sub CountDisp {
## 他サイトからのアクセスを排除
$ref_url =~ s/\?(.|\n)*//ig;
$ref_url =~ s/\%7E/\~/ig;
if (($BASE_URL ne ".") && ($ref_url !~ $BASE_URL)){ &error; }
if ( $ID > 999 ) { &error; }
if ( $UP eq 'ON' ) {
## クッキー設定
print "Set-Cookie: ";
if ( $OFFCNT eq '' ) { print "minocnt=$ID; "; }
else { print "minocnt=$OFFCNT,$ID; "; }
print "\n";
}
## ロック
&lockon;
## ログファイル読み込み
&ReadLog;
if ( $NAME eq '' ) { $NAME = "$ID"; }
# カウントアップの場合、ログを更新
if ( $UP eq 'ON' ) {
$COUNT++;
&PutLog;
$UP = 'OFF';
}
## アンロック
&lockoff;
## GIF画像を出力
&count_view;
exit;
}
## -------------------------------------------------------------------
## パスワード入力画面サブルーチン
## -------------------------------------------------------------------
sub InputPass {
&HtmlStart;
print "
ページ名 | 番号 | \n"; print "訪問件数 | カウント 回避 | 操作 |
\n";
print "「編集」をクリックするとページ名を編集します。
\n";
print "「リセット」をクリックすると訪問者数をゼロにします。
\n";
print "「削除」をクリックすると情報を削除します。
\n";
print "「回避ON」にするとこのブラウザーでカウントアップしなくなります。
\n";
print "「回避OFF」にするとこのブラウザーでカウントアップします。
\n";
&HtmlEnd;
}
## -------------------------------------------------------------------
## 操作確認画面サブルーチン
## -------------------------------------------------------------------
sub Conf {
&HtmlStart;
if ( $ACT eq 'リセット' ) { $COUNT = 0; }
print "■$ACT操作■
\n"; print "
\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## 操作実行サブルーチン ## ------------------------------------------------------------------- sub ExecOper { if ( $MODE eq '回避OFF' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; print "minocntM=$SETCOOK; "; print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; } if ( $MODE eq '回避ON' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; if ( $SETCOOK eq '' ) { print "minocntM=$ID; "; } else { print "minocntM=$SETCOOK,$ID; "; } print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; } if ( $MODE eq '削除' ) { $SETCOOK = ''; foreach $id ( split(/,/,$OFFCNTM) ) { if ( $ID ne $id ) { if ( $SETCOOK eq '' ) { $SETCOOK = "$id"; } else { $SETCOOK = "$SETCOOK,$id"; } } } print "Set-Cookie: "; print "minocntM=$SETCOOK; "; print "expires=Wed, 1-Jan-2020 00:00:00 GMT; "; print "\n"; &HtmlStart; $logfile = sprintf "$LOGFILE%03d",$ID; &lockon; unlink( $logfile ); &lockoff; } if ( $MODE eq '編集' || $MODE eq 'リセット' ) { &HtmlStart; if ($NAME =~ /:/) {$MSG = 'ページ名に:を含めることは出来ません。';&HtmlEnd;} &lockon; &PutLog; &lockoff; } print "操作が完了しました。
\n"; print "
\n"; &HtmlEnd; } ## ------------------------------------------------------------------- ## ログファイル読み込み処理サブルーチン ## ------------------------------------------------------------------- sub ReadLog { $logfile = sprintf "$LOGFILE%03d",$ID; if (!-f $logfile) { if ( open(OUT,">$logfile") ) { print OUT ""; close(OUT); } else { if ( $MODE eq '' ) { &error; } else { $MSG = 'ファイルが作成出来ません。'; &HtmlEnd; } } } $NAME = ''; $COUNT = 0; if ( open(IN,"$logfile") ) { while (