#!/usr/bin/perl # +---------+ # dopvCOMET* アクセスログ書き込みスクリプト | dcw.cgi | #--------------------------------------------------------------------+---------+ # 20030726 #------------------------------------------------------------------------------- #-------------------------------------------------------------------- 初期設定▼ require "./dci.pl"; &dcw_ini; #------------------------------------------------------------------------------- #---------------------------------------------------------------- 引数受け取り▼ if($ENV{'QUERY_STRING'} =~ /&&|&&/){ &get_query; # クエリーから取得 if($IN{'pd'} =~ /undefined|null/){ $IN{'pd'} = ''; } if($IN{'lng'} eq 'undefined'){ $IN{'lng'} = ''; } # ロボで無意味なデータを吐くやつがいる! elsif($IN{'lng'} =~ /^Openbot\//){ $IN{'lng'} = ''; } }else{ $a = $ENV{'QUERY_STRING'}; ($name,$value) = split(/=/,$a); if($name eq 'pg'){ $IN{'pg'} = $value; }else{ $IN{'pg'} = $a; } $IN{'pg'} =~ s/[^_a-zA-Z0-9-]//g; } # SSI式ならリンク元を取得 if($IN{'md'} eq 's'){ $IN{'rf'} = $ENV{'HTTP_REFERER'}; $IN{'rf'} =~ s/\,/\./g; } #------------------------------------------------------------------------------- #---------------------------------------------------------- クッキーによる処理▼ &get_cookie("$admin_cookie_name$cookie_path"); if($COOKIE{'who'} eq 'admin'){ &put_data; exit; } &get_cookie("$cookie_name$cookie_path"); # クッキー取得 if($wwcheck_by_cookie && $COOKIE{'pg'} eq $IN{'pg'}){ &put_data; exit; }else{ $stay_time = $time - $COOKIE{'t'}; if($stay_time >= $stay_time_border){ $stay_time = ''; } } #------------------------------------------------------------------------------- #---------------------------------------------------------- リンク元による処理▼ foreach (@deny_referrer){ if($_ ne '' && $IN{'rf'} =~ /\Q$_\E/){ $IN{'rf'} = ''; last; } } #------------------------------------------------------------------------------- #------------------------------------------------------ リモートホスト名の取得▼ $remote_host = $ENV{'REMOTE_HOST'}; $remote_addr = $ENV{'REMOTE_ADDR'}; if($remote_host eq '' || $remote_host eq $remote_addr){ $remote_host = gethostbyaddr(pack('C4',split(/\./,$remote_addr)),2); if($remote_host eq ''){ $remote_host = $remote_addr; } } foreach (@deny_host){ if($_ ne '' && ($remote_host =~ /\Q$_\E/ || $remote_addr =~ /\Q$_\E/)){ &put_data; exit; } } #------------------------------------------------------------------------------- #------------------------------------------------------------ ブラウザ名の取得▼ $hua = $ENV{'HTTP_USER_AGENT'}; if($hua ne ''){ &jcode'convert(*hua,'euc'); $hua =~ s/\,/\./g; $hua =~ s/&/&/g; $hua =~ s//>/g; $hua =~ s/"/"/g; } #------------------------------------------------------------------------------- #---------------------------------- ホスト名とブラウザ名によるログ取得拒否処理▼ foreach (keys %deny_host_agent){ if($_ ne '' && $hua =~ /\Q$deny_host_agent{$_}\E/ && ($remote_host =~ /\Q$_\E/ || $remote_addr =~ /\Q$_\E/)){ &put_data; exit; } } #------------------------------------------------------------------------------- #-------------------------------------------------------- プロクシチェック処理▼ ($proxy,$true_host) = &proxy; if($proxy_check > 0){ if(($proxy_check == 3 && $proxy =~ /e|ha/) || ($proxy_check == 2 && $proxy =~ /eh|ea|ha/) || ($proxy_check == 1 && $proxy eq 'eha')){ &put_data; exit; } } #------------------------------------------------------------------------------- #-------------------------------------------------------------------- 時刻取得▼ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year2 = $year + 1900; $mon++; if($mon < 10){ $mon = "0$mon"; } if($mday < 10){ $mday = "0$mday"; } #------------------------------------------------------------------------------- #------------------------------------------------------ ログ記録ファイル名設定▼ $log_file = "$logfiles_dir_path$year2$mon$mday\_"."$uqstr\.cgi"; #------------------------------------------------------------------------------- #-------------------------------------------------- ログファイルの書き込み処理▼ $lfh = &filelock; if(-e $log_file){ # 連続アクセスログ記録防止処理 if($wwcheck){ open(DB,"<$log_file") || &error("error3:can not open the log file"); $count = 0; $count++ while(); seek(DB,0,0); $i = 0; $j = $count - $wwcheck_loop; if($j < 1){ $j = 1; } foreach (){ $i++; if($i < $j){ next; } else{ @data = split(/\,/,$_); if($data[2] ne '' && $data[2] eq $remote_host && $data[11] ne '' && $data[11] eq $IN{'pg'}){ &unlock($lfh); &put_data; exit; } } # close else } # close foreach () close(DB); } # if($wwcheck) open(WT,">>$log_file") || &error("error2:can not open the log file"); $save_log_num = 0; }else{ open(WT,">$log_file") || &error("error1:can not open the log file"); } # if(-e $log_file) $log_data = "$time\,$IN{'pf'}\,$remote_host\,$remote_addr\,$proxy\,$true_host\,$hua\,$IN{'lng'}\,$IN{'swh'}\,$IN{'cd'}\,$IN{'pd'}\,$IN{'pg'}\,$COOKIE{'pg'}\,$stay_time\,$IN{'rf'}\n"; print WT $log_data; close(WT); chmod 0606,"$log_file" || &error("error3:can not change permission the log file"); #--- ログの数を調整する処理 if($save_log_num > 0){ opendir(DIR,"$logfiles_dir_path") || &error('ログ保存ディレクトリが開けません。'); foreach (readdir(DIR)){ if($_ =~ /^(\d\d\d\d)(\d\d)(\d\d)_$uqstr\.cgi$/){ push(@save_logs,$_); } } close(DIR); @save_logs = sort(@save_logs); while($#save_logs >= $save_log_num){ $del_log_file = shift(@save_logs); unlink("$logfiles_dir_path$del_log_file") || &error('ログファイルの削除に失敗しました。'); } } &unlock($lfh); &put_data; #------------------------------------------------------------------------------- #------------------------------------------------------ チェックメール送信処理▼ foreach (@mail_check_words){ if($_ ne '' && $cmd_sendmail ne '' && $log_data =~ /\Q$_\E/){ if($hour < 10){ $hour = "0$hour"; } if($min < 10){ $min = "0$min"; } if($sec < 10){ $sec = "0$sec"; } $mail_msg = <<"_TXT_"; ■「$_」を含むログが記録されました。$year2/$mon/$mday $hour:$min:$sec $log_data _TXT_ &sendmail($mail_master,$mail_master,$mail_title,$mail_msg); } } exit(0); #------------------------------------------------------------------------------- #---------------------------------------------------------------- データの出力▼ sub put_data { if($IN{'md'} ne 's'){ # IMG + JavaScript if($wwcheck_by_cookie == 1){ &put_cookie("$cookie_name$cookie_path",$cookie_on_days,"t:$time\,pg:$IN{'pg'}",$cookie_path); } print "Content-type: image/gif\n\n"; foreach (@images){ $data = pack('C*',hex($_)); print $data; } }else{ # SSI if($IN{'p'} eq '' || $ENV{'HTTP_USER_AGENT'} =~ /^googlebot\/\d/){ $i = "アクセス解析CGI"; &jcode'convert(*i,'sjis'); print "Content-type: text/html\n\n$i"; }elsif($IN{'p'} eq 'n'){ print "Content-type: text/html\n\n"; } } } #------------------------------------------------------------------------------- #------------------------------------------------------------------ エラー処理▼ sub error { &unlock($lfh); &put_data; die "$_[0] : $!"; exit; } #------------------------------------------------------------------------------- # Copyright (c) 2001-CurrentYear bayashi.net. All rights reserved. # http://www.bayashi.net/st/ # ok@bayashi.net