'터' 동호회 여러분 안녕하세요?
늦게나마 가입인사 올립니다.
CGI 동네는 조용해서 참 좋습니다.
근데 씨끌벅적해지면 더 좋겠습니다.
동호회 가입 기념으로 올려 놓으신 카운터 CGI 를 분석해 보있습니다.
Perl 스크립트 CGI 를 공부하실 분을 위해
번역, 해설, 그리고 약간의 수정을 해 보았습니다.
#!/usr/local/bin/perl
#######################################################################
# Audric's Counter v1.0 FREEWARE
# Full copyright and legal speak at:
# http://www.aimsweb.com/goodies/counter2.htm
#
# Inspired on Matt's Wright Counter program
# Matt's Script Archive http://www.worldwidemart.com/scripts/
#######################################################################
#######################################################################
## 수정, 번역 및 해설: 김필호 (phkim@math.soongsil.ac.kr)
## 날짜: 1999년 3월 1일
##
## 역자의 변:
## 아래의 변수 초기화 값은 각 사용자에 맞게 수정해서 써야 합니다.
## 저도 이와 비슷한 원리의 카운터을 직접 제작하여 1년 넘게
## 써 오고 있습니다. 그러나 카운터의 사용 경험에 의하면
## 아래의 소스만으로는 카운터 값을 저장하는 파일을 동시에
## 다수가 접근할 경우 그 파일의 내용이 소실되는 상황이 자주
## 발생합니다.
##
## 수정된 세 가지
## 1. $uselog = "1"; 을 $uselog = 1; 로 고침.
## 2. sub get_num { .... 에서 $count 변수를 로컬 변수로 바꾸고,
## $count 값을 리턴하는 것으로 수정함.
## 3. sub log_access { .... 부분에 flock(...) 추가.
#######################################################################
# Define Variables
## 이 CGI 에서 사용되는 변수의 초기화
## --------------------------------
## 카운터 숫자를 기록하는 파일
## chmod 777 로 파일 접근 권한 설정
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
$count_file = "/opt/home2/audric/HTML/count.txt";
## --------------------------------
## 카운터 이미지를 두는 경로
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
$digit_dir = "/goodies/";
## --------------------------------
## 접속 상황 기록 파일
## chmod 777 로 파일 접근 권한 설정
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
$access_log = "/opt/home2/audric/HTML/access_log"; # chmod 777 로 파일 접근 권한 설정
## --------------------------------
## 에러 기록 파일
## chmod 777 로 파일 접근 권한 설정
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
$error_log = "/opt/home2/audric/HTML/error_log"; # chmod 777 로 파일 접근 권한 설정
## --------------------------------
## 허락 받지 않은 곳에서 사용할 때 보여 주는 에러 그림
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
$bad_referer_img = "http://www.aimsweb.com/images/bad_referer.gif";
## --------------------------------
## 이 CGI를 링크하도록 허가된 웹 페이지의 호스트 주소.
## 각 사용자의 상황에 맞게 수정해야 함.
## --------------------------------
@referers=(
"www.aimsweb.com",
"aimsweb.com",
"204.192.121.27",
"127.0.0.1"
);
## --------------------------------
## 숫자 이미지의 크기. 가로와 세로.
## 이미지 파일명은 0.gif, 1.gif, ... , 9.gif
## 사용자의 이미지 파일의 크기에 맞게 수정해야 함.
## --------------------------------
$width = "9";
$height = "20";
## 로그 기록 여부. 1 이면 기록
## 원래 소스에는 "1" 이었으나 역자에 의해 1로 고침.
## 아래에서 exit; 하기 전에 if ($uselog == 1) { ....
## 로 비교함에 주목하기 바람.
$uselog = 1; # 1 = YES; 0 = NO
#######################################################################
# Done - You shouldn't need to change anything below this line..
## 아래 부분은 수정하지 마시오.
#######################################################################
#################
## 접속 상황을 기록할 경우 현재의 시각을 구해서 변수 $date 에 저장
#################
if ($uselog == 1) {
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon++; # fixes Matt's Counter bug
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($mon < 10) { $monc = "0$mon"; }
$date = "$hour\:$min\:$sec $mon/$mday/$year";
}
#################
# Make Sure People Aren't Messing With the Counter From Other Web Pages
## 아래는 사용하지 않음.
#################
#&check_referer;
#################
## 카운터 숫자를 구하고 그 값을 파일에 저장한다.
## 새 카운터 값은 변수 $count 에 저장
#################
$count = &get_num;
#################
## 변수 $count 에 보관된 수의 10진수 값을 하나씩 떼어 내어
## 연관변수 $CHAR 에 저장한다.
## 예를 들어, $count 의 값이 254 일 경우
## $COUNT{1} 에는 2, $COUNT{2} 에는 5, $COUNT{3} 에는 4
## 가 각각 저장된다.
#################
$savedcount=$count;
$num = $length = length($count);
while ($num > 0) {
$CHAR{$num} = chop($count);
$num--;
}
#################
## $COUNT{1}, $COUNT{2}, $COUNT{3}, ... 이런 값들로 부터
## img 태그 문자열을 만들어 $myNumber 라는 변수에 저장한다.
## $length 에는 카운터의 숫자 개수가 저장되어 있다.
#################
$j = 1;
$myNumber="";
while ($j <= $length) {
$myNumber .= "<img src=\"$digit_dir$CHAR{$j}\.gif\" border=0 width=$width height=$height>";
$j++;
}
#################
## HTML 양식으로 출력한다.
#################
print "Content-Type: text/html\n\n";
print "<table border=1 cellspacing=0 cellpadding=0><tr><td>$myNumber</td></tr></table>\n";
#################
## 기록하기 옵션이 참일 경우 로그 파일에 기록한다.
#################
if ($uselog == 1) {
&log_access;
}
exit;
######################################################
# SUBROUTINES
######################################################
#################
## 서버 환경 변수 HTTP_REFERER 의 값을 조사하여
## 접속 허용 여부를 결장한다.
sub check_referer {
if (@referers && $ENV{'HTTP_REFERER'}) {
foreach $referer (@referers) {
if ($ENV{'HTTP_REFERER'} =~ /$referer/) {
$ref = 1;
last;
}
}
}
else {
$ref = 1;
}
if ($ref != 1) {
## 허가 받지 않은 웹 페이지에서 이 카운터 CGI 를 링크하면
## 에러 이미지를 출력하고 종료한다.
print "Content-Type: text/html\n\n $bad_referer_img\n\n";
if ($uselog == 1) {
open(LOG,">>$error_log") || die "Can't Open User Error Log: $!\n";
print LOG "$error: $ENV{'REMOTE_HOST'} [$date] $ENV{'HTTP_REFERER'} - $ENV{'HTTP_USER_AGENT'}\n";
close(LOG);
}
exit;
}
}
#################
## 카운터 기록 파일로 부터 카운터 값을 읽어 변수 $count 에 보관한다.
#################
sub get_num {
open(COUNT,"$count_file") || die "Can't Open Count Data File: $!\n";
local($count) = <COUNT>; ## 역자에 의하여 수정됨
close(COUNT);
if ($count =~ /\n$/) {
chop($count);
}
$count++;
open(COUNT,">$count_file") || die "Can't Open Count Data File For Writing: $!\n";
print COUNT "$count";
close(COUNT);
return $count; ## 역자에 의해 추가됨
}
#################
## 접속 상황을 저장한다.
## [접속 시각]
sub log_access {
open(LOG,">>$access_log") || die "Can't Open User Access Log: $!\n";
flock(LOG, 2); ## 원래 소스에는 없으나 역자에 의해 추가됨.
print LOG "[$date] $ENV{'HTTP_REFERER'} - $ENV{'REMOTE_HOST'} - $ENV{'HTTP_USER_AGENT'}\n";
flock(LOG, 8); ## 원래 소스에는 없으나 역자에 의해 추가됨.
close(LOG);
}
