[분석1] 카운터 CGI 를 분석해 보았습니다.

1999. 3. 1. 오후 9:19:01

글자

'터' 동호회 여러분 안녕하세요?

늦게나마 가입인사 올립니다.

 

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);

}

 

댓글 0

첫 댓글을 남겨보세요

[테크닉게시판] CGI

목록 전체보기 →