NonSoft

アクセスログ出力・表示のサンプル(perl)


 サンプル(ソース/コード)
<このサンプルの概要>
ホームページにどこのリンクから来たか?アクセスログを出力/表示するサンプルソース
です。CGI はperl、スクリプトはJavaScriptで記述しています。「アクセスログ出力サン
プル(perl)」は URL パラメタでJavaScriptのアクセス元URL(document.referrer)を受
け取りログ出力します。ソース中のpoint.gif には小さくてページ表示の邪魔にならない
イメージを指定します。自サイト以外のアクセスログを出力しないように自サイトチェッ
クをしていますのでerror.gif にエラーを意味するイメージを指定します。「アクセスロ
グ表示サンプル(perl)」は、「アクセスログ出力サンプル(perl)」で出力したログをHTML
形式でブラウザに表示します。不正アクセス防止のためパスワードチェックを行なってい
ます。表示形式としてはHTMLのtableタグ を使用した形式とタブ区切りのテキストデータ
そのままの形式があります。タブ区切りのテキストデータそのままの形式はブラウザのソ
ースをエクセルに貼り付けて解析する時に便利な形式です。

★アクセスログ出力サンプル(perl)

#!/usr/local/bin/perl
#---------------------------------------------------------------------
# ファイル名:NONfrom.cgi:アクセスログ出力 Ver1.00
#
# 更新履歴:
# 2007.06.09 Ver1.00 初版。              作成者(のん)
# 2007.06.09 Ver1.00 更新履歴の例           変更者(のん)
#
# Copyright (c) 2007 のん
# 種 別 :フリーソフト
# 著作権 :著作権は放棄しません。
#      ファイル名の変更は禁止します。使用・改造・再配布は制限し
#      ませんが、改造したものを配布する場合は更新履歴をいれてく
#      ださい。
#
# 機能概要:ホームページにどこのリンクから来たか?アクセスログ出力
#
# パラメタ:from----アクセス元URL(document.referrer)
#
# 起動方法:
#   アクセスログを出力するページの最後に以下のスクリプト記述します
#   <script language="JavaScript"><!--
#     document.write(
#     "<IMG SRC=\"http://xxx.xxx.xxx/NONfrom/NONfrom.cgi?from="+
#           document.referrer+"\">");
#   // --></script>
#
# ファイル: アクセスログファイル(data/YYYYMMDD.txt)
#
# インストール方法:
# NONfrom.cgiの $site="nonsoft.la.coocan.jp"; の部分を自サイト
# のURL に変更します。NONfrom.cgiと関連ファイルをCGIが動作するディレ
# クトリに置きます。NONfrom.cgiファイルに実行権を与えます。NONfrom.c
# giと同じディレクトリにdataディレクトリを作成します。
#
#---------------------------------------------------------------------
# 入力情報を取得
if($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
	$str = $str . "&" . $ENV{'QUERY_STRING'};
}elsif($ENV{'REQUEST_METHOD'} eq "GET") {
	$str = $ENV{'QUERY_STRING'};
}
$ip = $ENV{REMOTE_ADDR};
$my = $ENV{HTTP_REFERER};

# 入力情報を個別に定義
$fs = "	";
if( $str ne "" ){
	%cgi = "";
	@part = split( '&' , $str );
	foreach $i (@part) {
		($variable,$value) = split('=',$i);
		$value =~ tr/+/ /;
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
#		&jcode'convert(*value, 'euc');
		$value =~ s/&/&amp;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		$value =~ s/"/&quot;/g;
		$value =~ s/'/&#39;/g;
		$value =~ s/\015\012/\012/g;
		$value =~ s/\015/\012/g;
		if( $cgi{$variable} eq "" ){
			$cgi{$variable} = $value;
		}else{
			$cgi{$variable} = $cgi{$variable} . $fs . $value;
		}
	}
	# 起動情報の個別定義
	$from = $cgi{'from'};
}

# 不正アクセス防止のため自サイトのURLチェック
$site="nonsoft.la.coocan.jp";
if( !($my =~ m/$site/) ){
	# エラーのイメージを呼び出し元に返す
	print "Content-type: image/gif\n\n";
	open(IN,"error.gif");
	binmode(IN);
	binmode(STDOUT);
	print $_ while (<IN>);
	close(IN);
	exit;
}
# ダミーのイメージを呼び出し元に返す
print "Content-type: image/gif\n\n";
open(IN,"point.gif");
binmode(IN);
$| = 1;
binmode(STDOUT);
print $_ while (<IN>);
close(IN);

# アクセスログ出力(ファイル名:YYYYMMDD.txt)
# フォーマット(日時、アクセス先URL、アクセス元IP、アクセス元URL)
local($now)=time();
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
$mon++;$year+=1900;
local $date   = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec);
local $date_f = sprintf("%04d%02d%02d",$year,$mon,$mday);
$from_file = "data/$date_f.txt";
open(OUT, ">> $from_file");
print(OUT "$date\t$my\t$ip\t$from\n");
close(OUT);
exit;

★アクセスログ表示サンプル(perl)

#!/usr/local/bin/perl
#---------------------------------------------------------------------
# ファイル名:NONfromDsp.cgi:アクセスログ表示 Ver1.00
#
# 更新履歴:
# 2007.06.09 Ver1.00 初版。              作成者(のん)
# 2007.06.09 Ver1.00 更新履歴の例           変更者(のん)
#
# Copyright (c) 2001 のん
# 著作権 :著作権は放棄しません。
#      ファイル名の変更は禁止します。使用・改造・再配布は制限し
#      ませんが、改造したものを配布する場合は更新履歴をいれてく
#      ださい。
#
# 機能概要:ホームページにどこのリンクから来たか?アクセスログ表示
#
# パラメタ:psw----パスワード(必須)
#      mod----表示形式 (default=0)
#          (0=HTMLのTABLEタグを使用)
#          (1=タブ区切りのテキストデータそのまま)
#
# 起動方法:
#   以下のURLを指定していします
#     http://xxx.xxx.xxx/NONfrom/NONfromDsp.cgi?psw=1234567890"
#
# ファイル: アクセスログファイル(data/YYYYMMDD.txt)
#
# インストール方法:
# NONfromDsp.cgiの $PassWordOrg="1234567890"; の部分を専用のパスワー
# ドに変更します。NONfromDsp.cgi と関連ファイルをCGIが動作するディレ
# クトリに置きます。NONfromDsp.cgiファイルに実行権を与えます。NONfro
# mDsp.cgiと同じディレクトリにdataディレクトリを作成します。
#
#---------------------------------------------------------------------
# 入力情報を取得
if($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
	$str = $str . "&" . $ENV{'QUERY_STRING'};
}elsif($ENV{'REQUEST_METHOD'} eq "GET") {
	$str = $ENV{'QUERY_STRING'};
}

# 入力情報を個別に定義
$fs = "	";
if( $str ne "" ){
	%cgi = "";
	@part = split( '&' , $str );
	foreach $i (@part) {
		($variable,$value) = split('=',$i);
		$value =~ tr/+/ /;
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
#		&jcode'convert(*value, 'euc');
		$value =~ s/&/&amp;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		$value =~ s/"/&quot;/g;
		$value =~ s/'/&#39;/g;
		$value =~ s/\015\012/\012/g;
		$value =~ s/\015/\012/g;
		if( $cgi{$variable} eq "" ){
			$cgi{$variable} = $value;
		}else{
			$cgi{$variable} = $cgi{$variable} . $fs . $value;
		}
	}
	# 起動情報の個別定義
	$psw = $cgi{'psw'};
	$mod = $cgi{'mod'};
}

# 不正アクセス防止パスワードチェック
$PassWordOrg="1234567890";
if( $psw ne $PassWordOrg ){
	print "Content-type: text/plain\n\n";
	print "<html>\n";
	print "<head>\n";
	print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
	print "</head>\n";
	print "<body>\n";
	print "不正アクセスはやめてください。<br>\n";
	print "</body>\n";
	print "</html>\n";
	exit;
}

# アクセスログを呼び出し元に返す(ファイル名:YYYYMMDD.txt)
local($now)=time();
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now);
$mon++;$year+=1900;
local $date_f = sprintf("%04d%02d%02d",$year,$mon,$mday);
$from_file = "data/$date_f.txt";

if($mod eq "" || $mod eq "0"){
	# 表示にHTMLのTABLEタグを使用
	print "Content-type: text/html\n\n";
	print "<html>\n";
	print "<head>\n";
	print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
	print "<title>アクセスログ</title>\n";
	print "</head>\n";
	print "<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n";
	print "<table border=1>\n";
	print "<tr>\n";
	print "<td><font size=2><center>No.</center></font></td>\n";
	print "<td><font size=2><center>日時</center></font></td>\n";
	print "<td><font size=2><center>アクセス先URL</center></font></td>\n";
	print "<td><font size=2><center>アクセス元IP</center></font></td>\n";
	print "<td><font size=2><center>アクセス元URL</center></font></td>\n";
	print "</tr>\n";
	$no=0;
	open(IN,$from_file);
	while(<IN>){
		chop($_);
		@itm = split("\t",$_,-1);
		$no++;
		if(@itm[0] eq ""){@itm[0]="null"};
		if(@itm[1] eq ""){@itm[1]="null"};
		if(@itm[2] eq ""){@itm[2]="null"};
		if(@itm[3] eq ""){@itm[3]="null"};
		print "<tr>\n";
		print "<td><font size=2><center>$no</center></font></td>\n";
		print "<td><font size=2>@itm[0]</font></td>\n";
		print "<td><font size=2>@itm[1]</font></td>\n";
		print "<td><font size=2>@itm[2]</font></td>\n";
		print "<td><font size=2>@itm[3]</font></td>\n";
		print "</tr>\n";
	}
	close(IN);
	print "</table>\n";
	print "</body>\n";
	print "</html>\n";
}else{
	# 表示はタブ区切りのテキストデータそのまま
	print "Content-type: text/html\n\n";
	print "<html><head>\n";
	print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";
	print "</head>\n";
	print "<body>\n";
	print "<pre>\n";
	open(IN,$from_file);
	while(<IN>){
		chop($_);
		print "$_\n";
	}
	print "</pre>\n";
	print "</body>\n";
	print "</html>\n";
}
exit;
★アクセスログ表示例
No.
日時
アクセス先URL
アクセス元IP
アクセス元URL
1
2007/06/09 12:49:54 http://xxx.xxx.xxx/SampleNONfrom.html 999.999.999.999 http://search.yahoo.co.jp/search?p