#! /usr/bin/perl #┌───────────────────────────────── #│ COSMO GATE v4 #│ gate.cgi - 2006/10/11 #│ Copyright (c) KentWeb #│ webmaster@kent-web.com #│ http://www.kent-web.com/ #└───────────────────────────────── # 設定ファイル require './init.cgi'; $ret = &decode; if (!$ret) { &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"); print ; close(IN); $headflag = 1; } #------------------------------------------------- # 移動先出力 (CGI) #------------------------------------------------- sub cgi_view { print "Content-type: text/html\n\n"; print <<"EOM"; 福山ライオンズクラブ会員ページ EOM $headflag = 1; } #------------------------------------------------- # パスワード画面 #------------------------------------------------- sub login { # クッキーを取得 local($id, $pw) = &get_cookie; &header; print <<"EOM";
▼福山ライオンズクラブ会員ページ
ログインID
パスワード
  パスワード記憶


- cosmogate -
EOM exit; } #------------------------------------------------- # パスワードエラー #------------------------------------------------- sub pass_error { &header; print <<"EOM";


パスワードが不正です


EOM exit; } #------------------------------------------------- # PASS認証 #------------------------------------------------- sub pass_chk { # 入力チェック if ($in{'pw'} eq "") { &error("PASSWORDが入力されていません"); } # ファイルオープン local($flg,$id,$pw); open(IN,"$pwdfile") || &error("Open Error: $pwdfile"); while() { ($id,$pw) = split(/:/); # ID一致 if ($in{'id'} eq $id) { $flg = 1; $pw =~ s/\n//; last; } } close(IN); # ID該当なしまたは不照合はエラー if (!$flg) { &pass_error; } elsif (&decrypt($in{'pw'}, $pw) != 1) { &pass_error; } # ID/PASS情報をクッキー格納 if ($in{'cook'} == 1) { &set_cookie($in{'id'}, $in{'pw'}); } else { &set_cookie(); } } #------------------------------------------------- # アクセスログ #------------------------------------------------- sub axslog { local($agent,@data); # 時間取得 &get_time; # ホスト名取得 &get_host; # ブラウザ情報 $agent = $ENV{'HTTP_USER_AGENT'}; $agent =~ s/&/&/g; $agent =~ s//>/g; $agent =~ s/"/"/g; # ログファイルの読み込み open(DAT,"+< $logfile") || &error("Open Error: $logfile"); @data = ; # ログ更新 while ($max <= @data) { pop(@data); } unshift(@data,"$in{'id'}<>$date<>$host<>$agent<>\n"); seek(DAT, 0, 0); print DAT @data; truncate(DAT, tell(DAT)); close(DAT); } #------------------------------------------------- # クッキー発行 #------------------------------------------------- sub set_cookie { local($id, $pw) = @_; 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]); # 暗号化 if ($pw ne "") { $pw = &pcp_encode($pw, $pcp_key); } # 格納 print "Set-Cookie: COSMO_GATE_3=$id<>" . $pw . "; expires=$gmt\n"; } #------------------------------------------------- # クッキー取得 #------------------------------------------------- sub get_cookie { # クッキーを取得 local($cook) = $ENV{'HTTP_COOKIE'}; # 該当IDを取り出す local(%cook); foreach ( split(/;/, $cook) ) { local($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } # データ取り出し local($id, $pw) = split(/<>/, $cook{'COSMO_GATE_3'}); # パスワード復号 $pw = &pcp_decode($pw, $pcp_key); return ($id, $pw); } #------------------------------------------------- # crypt照合 #------------------------------------------------- sub decrypt { local($in, $dec) = @_; local($salt) = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2); if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) { return 1; } else { return 0; } } #------------------------------------------------- # 簡易暗号 #------------------------------------------------- # ゆいさんの暗号化サブルーチンを流用しました # http://www.cup.com/yui/ sub pcp_decode { local($comment,$key,$i,$j,@key); $comment = $_[0]; $key = $_[1]; @key = split(//,$key); $i = 0; $j = &pcp_make_Table($key); $comment=~ s/./$pcp_table{$&}/g; $comment =~ s/.../sprintf("%c",oct($&)^(ord($key[$i++ % @key]) +($j++ % 383)))/ges; $comment=~s/\0$//; return $comment; } sub pcp_encode { local($comment,$key,$i,$j,@key); $comment = $_[0]; $key = $_[1]; $comment .="\0" if(length($comment) % 2); @key = split(//,$key); $i = 0; $j = &pcp_make_Table($key); $comment =~ s/./sprintf("%03o",ord($&)^(ord($key[$i++ % @key])+($j++ % 383)))/ges; $comment=~ s/../$pcp_table{$&}/g; return $comment; } sub pcp_make_Table{ local(@list,$i,$j,$k,$init_j,@key,@seed); @seed = split(//,'q1aZ.XzS5xACs27wD6eE4d8c0!WvQfRFr9Gt3TgBVbNMnJhyKIujUmYkHiLlOoPp'); @key = split(//,$_[0]); $k=@key; $init_j=0; for($i=0;$i<64;$i++){ $j=ord($key[$i % $k]); $init_j +=$j; $list[$i]=splice(@seed,(($j+$k) % (64-$i)),1); } $k=0; for($i=0;$i<8;$i++){ for($j=0;$j<8;$j++,$k++){ $pcp_table{"$i$j"}=$list[$k]; $pcp_table{$list[$k]}="$i$j"; } } return ($init_j % 383); } #------------------------------------------------- # チェックモード #------------------------------------------------- sub check { &header; print <Check Mode
    EOM # 隠しファイル if ($kind == 0) { if (-f $goto) { print "
  • 隠しHTMLのパス:OK\n"; } else { print "
  • 隠しHTMLのパス:NG\n"; } } elsif ($kind == 1) { if ($goto !~ /^http\:\/\//) { print "
  • 隠しファイルのパス:NG
    → CGIの隠しファイルは http://から記述すること\n"; } } # ログパス local(%log) = ( $logfile, 'ログファイル', $admlog, '管理ログファイル', $pwdfile, 'パスワードファイル', ); foreach ( keys(%log) ) { if (-f $_) { print "
  • $log{$_}のパス:OK\n"; if (-r $_ && -w $_) { print "
  • $log{$_}のパーミッション:OK\n"; } else { print "
  • $log{$_}のパーミッション:NG\n"; } } else { print "
  • $log{$_}のパス:NG → $_\n"; } } print <バージョン : $ver
EOM exit; }