#!/usr/local/bin/perl ## pass.cgi # 設定ファイル require './init.cgi'; $in = &decode; if (!$in) { &login; } elsif ($mode eq "check") { ✓ } &pass_chk; if ($kind == 0) { &html_view; } elsif ($kind == 1) { &cgi_view; } else { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $goto\n\n"; } &axslog; exit; #---------------------# # 移動先出力 (HTML) # #---------------------# sub html_view { # 対象ファイルを確認 unless (-e $goto) { &error("隠しファイルへのパス指定が不正です"); } # 隠しファイル表示 print "Content-type: text/html\n\n"; open(IN,"$goto") || &error("Open Error: $goto"); while () { print; } close(IN); $headflag=1; } #--------------------# # 移動先出力 (CGI) # #--------------------# sub cgi_view { print "Content-type: text/html\n\n"; print <<"EOM"; SecretFile EOM $headflag=1; } #------------------# # パスワード画面 # #------------------# sub login { # クッキーを取得 local($id, $pw) = &get_cookie; &header; print <<"EOM";


ログインパスワードの入力
認証情報を入力してください。

ユーザーID :
パスワード :
ユーザーID、パスワードを記憶

ID、パスワードをお忘れの方は事務局までお問い合わせ下さい。
EOM exit; } #--------------------# # パスワードエラー # #--------------------# sub pass_error { &header; print <<"EOM";


ユーザーID又はパスワードが違います


EOM exit; } #------------# # PASS認証 # #------------# sub pass_chk { # 入力チェック if ($in{'pw'} eq "") { &error("PASSWORDが入力されていません"); } # ID/PASSをマッチング local($flag)=0; foreach (0 .. $#PW) { if ($PW[$_] eq '') { next; } if ($in{'id'} eq $ID[$_] && $in{'pw'} eq $PW[$_]) { $flag=1; last; } } # 該当なしの場合はエラー処理 if (!$flag) { &pass_error; } # ID/PASS情報をクッキー格納 if ($in{'chk'} eq 'on') { &set_cookie($in{'id'}, $in{'pw'}); } else { &set_cookie(); } } #----------------# # アクセスログ # #----------------# sub axslog { # 時間取得 &get_time; # ホスト名取得 &get_host; # ロック開始 &lock if ($lockkey); # ログファイルの読み込み open(IN,"$log1") || &error("Open Error: $log1"); local @data = ; close(IN); # ログ更新 while ($max <= @data) { pop(@data); } unshift(@data,"$in{'id'}<>$date<>$host<>$ENV{'HTTP_USER_AGENT'}<>\n"); open(OUT,">$log1") || &error("Write Error : $log1"); print OUT @data; close(OUT); # ロック解除 &unlock if ($lockkey); } #----------------# # クッキー発行 # #----------------# sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); # 国際標準時を定義 $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); # 保存データ $cook=''; foreach (@cook) { $cook .= "$_<>"; } # 格納 print "Set-Cookie: COSMO_GATE=$cook; expires=$gmt\n"; } #----------------# # クッキー取得 # #----------------# sub get_cookie { local($key, $val, *cook); # クッキーを取得 $cook = $ENV{'HTTP_COOKIE'}; # 該当IDを取り出す foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } # データ取り出し @cook = split(/<>/, $cook{'COSMO_GATE'}); return (@cook); } #--------------# # ロック処理 # #--------------# sub lock { # 1分以上古いロックは削除する if (-e $lockfile) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time - 60) { &unlock; } } local($retry) = 5; while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { &error('LOCK is BUSY'); } sleep(1); } $lockflag=1; } #--------------# # ロック解除 # #--------------# sub unlock { rmdir($lockfile); $lockflag=0; } #------------------# # チェックモード # #------------------# sub check { &header; print <Check Mode
    EOM # 隠しファイル if ($kind == 0) { if (-e $goto) { print "
  • 隠しHTMLのパス:OK\n"; } else { print "
  • 隠しHTMLのパス:NG\n"; } } elsif ($kind == 1) { if ($goto !~ /^http\:\/\//) { print "
  • 隠しファイルのパス:NG
    → CGIの隠しファイルは http:// から記述すること\n"; } } # ログパス local @log1 = ("一般ログ", "管理者ログ"); local @log2 = ($log1, $log2); foreach (0, 1) { print "
  • $log1[$_]\n
      \n"; if (-e $log2[$_]) { print "
    • ログファイルのパス:OK\n"; if (-r $log2[$_] && -w $log2[$_]) { print "
    • ログファイルのパーミッション:OK\n"; } else { print "
    • ログファイルのパーミッション:NG\n"; } } else { print "
    • ログファイルのパス:NG → $log2[$_]\n"; } print "
    \n"; } # ロック設定 if (!$lockkey) { print "
  • ロック設定なし\n"; } else { print "
  • ロック設定あり\n"; ($lockdir) = $lockfile =~ /(.*)[\\\/].*$/; print "
  • ロックディレクトリ:$lockdir\n"; if (-d $lockdir) { print "
  • ロックディレクトリのパス:OK\n"; if (-r $lockdir && -w $lockdir && -x $lockdir) { print "
  • ロックディレクトリのパーミッション:OK\n"; } else { print "
  • ロックディレクトリのパーミッション:NG → $lockdir\n"; } } else { print "
  • ロックディレクトリのパス:NG → $lockdir\n"; } } print < EOM exit; } __END__