#!/usr/bin/perl $ver = 'Gate v2.6'; #---------------------------------------------------------------# # ・このスクリプトはフリーソフトです。このスクリプトを使用した # # いかなる損害も作者はその責を負いません。 # # ・設置に関する質問は直接メールではお受けできませんので必ず # # 「サポート掲示板」へお願いいたします。 # #---------------------------------------------------------------# # ■設置例 # /home/kent/ # | # +-- private_html / secret.html [644] ... 隠しファイル # | # +-- public_html / index.htmlなど # | # +-- member / gate.cgi [755] # log.dat [666] # ■アクセスログの閲覧の仕方 (gate.cgi?mode=admin) # http://〜〜/member/gate.cgi?mode=admin # *上記のように、?mode=admin という引数を付けてアクセスする。 # *管理用パスワードの入力画面となりますので、下記設定の $pass で # 指定するパスワードを入力して下さい。 #============# # 設定項目 # #============# # 隠しファイルのフルパス # --> HTMLファイルの場合は、現在位置からの相対パスで記述 # 編集されるため表示ファイル内は絶対パスで記述 # --> CGIファイルの場合は、http:// からのパスで記述 #$goto = "http://www.comboy.jp/cgi-bin/test.cgi?thm=01"; $goto = "../yabai/downpg.html"; #x$goto = "/main.html"; # 隠しファイルの種類 (HTML=0 CGI=1 その他=2) $kind = 0; # bodyタグ $body = ''; # スクリプトファイル名 $script = "./gate.cgi"; # method形式 (POST/GET) $method = 'POST'; # アクセスログの記録 (0=no 1=yes) $logkey = 1; # 管理者用パスワード (英数字) $pass = 'ComboyCoJp'; # 集計一覧からの戻り先 $home = '../index.html'; # アクセスログファイル $logfile = './log.dat'; # アクセスログ最大保持数 $max = 100; # ユーザIDとパスワードを指定 # --> 上下のID/PASS配列はコンマで区切っていくつでも指定可 # --> 上下の配列は必ずペアで @UserID = ('comboy', 'takanashi'); @UserPW = ('7777', 'takefumi'); # ホスト名取得方式 # --> 0 : $ENV{'REMOTE_HOST'} # --> 1 : gethostbyaddr $gethostbyaddr = 0; #============# # 設定完了 # #============# ## COSMO GATEのメイン処理 &decode; if ($buffer eq "") { ✓ } if ($mode eq "admin") { &admin; } &pass_chk; if ($kind == 0) { &html_view; } elsif ($kind == 1) { &cgi_view; } else { if ($logkey) { &axslog; } print "Location: $goto\n\n"; } exit; #-----------------------------# # パス一致の処理 (HTML出力) # #-----------------------------# sub html_view { # 対象ファイルを確認 # unless (-e "$goto") { # &error("隠しファイルへの「パス」指定が不正です"); # } # # HTMLを読み込み open(IN,"$goto") || &error("Open Error : $goto"); @lines = ; close(IN); # Macでバイナリー転送されたHTML対応 if (@lines == 1 && $lines[0] =~ /\r/) { @lines = split(/\r/, $lines[0]); } # HTMLを表示 print "Content-type: text/html\n\n"; foreach (@lines) { print $_; } if ($logkey) { &axslog; } } #--------------------------------------# # パス一致の処理 (フレームでCGI出力) # #--------------------------------------# sub cgi_view { print "Content-type: text/html\n\n"; print "\n"; print "SECRET FILE\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($logkey) { &axslog; } } #------------------# # パスワード画面 # #------------------# sub check { # クッキーを取得 &get_cookie; &header; print <<"EOM";


www.comboy2.jp


USER IDとPASSWORDを入力してください $goto

USER ID
PASSWORD
認証情報を保存する
 
Copyright (C) 2001 by COMBOY Corporation.All Rights Reserved.
EOM exit; } #------------------------# # パスワードエラー処理 # #------------------------# sub pass_error { &header; print <<"EOM";



パスワードが不正です


戻る

EOM exit; } #-----------------------# # ID/PASSチェック処理 # #-----------------------# sub pass_chk { # 入力チェック if ($pw eq "") { &error("PASSWORDが入力されていません"); } # ID/PASSをマッチング local($flag) = 0; foreach (0 .. $#UserID) { if ($id eq "$UserID[$_]" && $pw eq "$UserPW[$_]") { $flag = 1; last; } } # 該当なしの場合はエラー処理 if ($flag == 0) { &pass_error; } # ID/PASS情報をクッキー格納 if ($in{'chk'} eq 'on') { &set_cookie('on'); } else { &set_cookie('off'); } } #----------------------# # アクセスログを取得 # #----------------------# sub axslog { # 時間を取得 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); # 日時のフォーマット $date = sprintf("%04d\/%02d\/%02d\-%02d\:%02d\:%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec); # ログファイルの読み込み open(IN,"$logfile") || &error("Open Error : $logfile"); @data = ; close(IN); # 最大ログ数の調整 while ($max <= @data) { pop(@data); } # ホスト名を取得 &get_host; # ログをフォーマット unshift(@data,"$id<>$date<>$host<>$ENV{'HTTP_USER_AGENT'}<>\n"); # ログを更新 open(OUT,">$logfile") || &error("Write Error : $logfile"); print OUT @data; close(OUT); } #--------------# # 管理モード # #--------------# sub admin { # 入室処理 if ($in{'pass'} ne "$pass") { &header; print "

パスワードを入力して下さい

\n"; print "

\n"; print "\n"; print ""; print "\n"; print "\n"; exit; } # ログファイルの読み込み open(IN,"$logfile") || &error("Open Error : $logfile"); @log = ; close(IN); &header; print <<"EOM";

アクセスログ一覧集計


EOM # ログ一覧の場合 if ($in{'shukei'} ne "on") { print "\n"; print "\n"; $i = 0; foreach (@log) { ($uid,$date,$host,$bruz) = split(/<>/, $_); $i++; print ""; print "\n"; } print "
No日時USER IDホスト名ブラウザ
$i$date$uid$host$bruz
\n"; } # ログ集計の場合 else { print "\n"; print "\n"; foreach (@UserID) { $i=0; foreach $x (@log) { ($uid,$date,$host,$bruz) = split(/<>/, $x); if ($_ eq "$uid") { $i++; } } # セル集計表示 print "\n"; } print "
USER IDアクセス数
$_$i
\n"; } print "

\n"; print "\n"; exit; } #------------------# # エラー表示処理 # #------------------# sub error { &header; print "

ERROR !

\n"; print "

$_[0]\n"; print "


\n"; print "\n"; exit; } #------------------# # HTMLのヘッダー # #------------------# sub header { print "Content-type: text/html\n\n"; print <<"EOM"; comboy members $body EOM } #----------------# # デコード処理 # #----------------# sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } $mode = $in{'mode'}; $id = $in{'id'}; $pw = $in{'pw'}; } #------------------# # クッキーの発行 # #------------------# sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg) = gmtime(time + 60*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; if ($_[0] eq "on") { $cook = "id\:$id\,pw\:$pw"; } else { $cook = "id:,pw:"; } print "Set-Cookie: GATE=$cook; expires=$date_gmt\n"; } #------------------# # クッキーを取得 # #------------------# sub get_cookie { $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/, $cookies); foreach (@pairs) { local($name,$value) = split(/=/, $_); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/, $DUMMY{'GATE'}); foreach (@pairs) { local($name,$value) = split(/:/, $_); $COOKIE{$name} = $value; } $c_id = $COOKIE{'id'}; $c_pw = $COOKIE{'pw'}; } #----------------# # ホスト名取得 # #----------------# sub get_host { $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($gethostbyaddr) { if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($host eq "") { $host = $addr; } }