CGI-BBS > 基本認証 > 仕組み > CGIでパスワード制限 v1.0にログインデータを追加するには?


カレッヂ
カレッヂ


質問者 rannko  投稿日 4/13(土) 15:02:17

「CGIでパスワード制限 v1.0」を改修してログインしたときのIDと時間を記録したいのですが、時間しか記録されません。
何方かアドバイスして頂けないでしょうか。

####################################################################

構成
# |-login.html(パスワード入力フォーム)
# |-<b>private_html</b>
# |       |-- 任意のファイル
# |
# |-cgi-bin
# |       |
# |       |--enter.cgi
# |       |--log.dat

####################################################################

login.htmlの内容
<html>
<body>
  <h2>ログイン画面</h2>
    <form action="cgi-bin/enter.cgi" method="post">
        <input type="hidden" name="target" value="a.html"><p>ID <input
        type="text" size="20" name="id"><br>
        PASSWORD <input type="password" size="20" name="password"></p>
        <p><input type="submit" value="LOGIN"> </p>
    </form>
</body>
</html>

####################################################################

enter.cgiの内容
#!/usr/local/bin/perl

$private_html = '../private_html';
$data = './log.dat';
require './jcode.pl';

if ($ENV{'SERVER_SOFTWARE'} =~ /^AnWeb/) {$flock ='';}

        $buffer = $ENV{'QUERY_STRING'};
        @pairs = split(/&/,$buffer);
        foreach $pair (@pairs)
        {
            ($name, $value) = split(/=/, $pair);
            $value =~ tr/+/ /;
            $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
            $FORM{$name} = $value;
        }

$id = $FORM{'ID'};              #idを取得

#----------------------------------------------------------------------------
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon =$mon+1;
$year =$year-88;
if ($mon < 10) { $mon = "0$mon"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
#$starttime = "$hour:$min:$sec";
$starttime = "平成$year年$mon月$mday日$hour時$min分$sec秒";

#----------------------------------------------------------------------------

if (!open(OUT,">>$data")) { #追加モードでファイルをオープン
#失敗したらエラーを表示
print "Content-type: text/html\n\n";
print "<H1>Register Error</H1>";
exit(0);
}
#flock(OUT,2); #ファイルをロック
print OUT "$id,$starttime\n";#データを書き足す
close(OUT); #ファイルをクローズ

#---------------------------------------------------------------------
$ID[0] = 'rescue';           $PW[0] = 'test';
$ID[1] = 'taro';             $PW[1] = 'paopao';
$ID[2] = 'jiro';             $PW[2] = 'wahaha';
$ID[3] = 'rescue@ask.or.jp'; $PW[3] = 'justy';
$ID[4] = 'sabu';             $PW[4] = 'boygirl';
#---------------------------------------------------------------------

if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/,$buffer);
foreach $pair (@pairs)
{
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
}

$members = @ID;
foreach (0 .. $members -1) {

  if ($FORM{'password'} eq $PW[$_] && $FORM{'id'} eq $ID[$_]) { $target = $FORM{'target'}; &html; }
}

$target = '401.html'; &html;


sub html {

   if (!open(HTML,"$private_html\/$target")) { &html404; }
   @lines = <HTML>;
   close(HTML);

   print 'Content-type: text/html' ."\n\n";
   foreach (@lines) { print; }
   exit;
}

sub html404 {

   # 上記 sub html で404.htmlを扱うことができますが、万が一404.htmlが開けない場合、
   # 無限ループを起こしてしまうので、このルーチンを別に付けました。このルーチンには
   # エラー処理をしていませんので、404.htmlが開けない場合はサーバエラーになります。

   open(HTML,"$private_html\/404.html");
   @lines = <HTML>;
   close(HTML);

   print 'Content-type: text/html' ."\n\n";
   foreach (@lines) { print; }
   exit;
}
回答者 今夜はやすだ  [削除]  投稿日 4/14(日) 03:04:59
そもそも、POSTでのデータをきちんと取得してません。それが原因で、FORMハッシュが意味なく存在してます。

if($ENV{REQUEST_METHOD} eq "POST"){
        if($ENV{CONTENT_LENGTH} > 51200){
                print "Content-type: text/html\n\nMAX CONTENT_LENGHT ERROR.\n";  <---エラー処理、本来ならhtmlで
                exit 1;
        }
        read(STDIN,$buffer,$ENV{CONTENT_LENGTH});
}elsif($ENV{REQUEST_METHOD} eq "GET"){
        $buffer = $ENV{QUERY_STRING};
}

$buffer変数をsplitする前に上のことを最低限してください。
質問者 rannko  [削除]  投稿日 4/15(月) 11:10:10
レスありがとうございます。
恐れ入りますが、私自身超素人のため御指摘の内容を適切に理解できませんでした。

if ($ENV{'SERVER_SOFTWARE'} =~ /^AnWeb/) {$flock ='';}

の手前に置いたらよろしいのでしょうか?(うまく動かないので違いますよね?)

すみませんが、改めて御教示頂けると幸いです。
回答者 今夜はやすだ  [削除]  投稿日 4/16(火) 00:11:03
codingを見た感じ、初心者なような気がしてはいたのですが、そうでしたか。
それでは、ちょっと分かりにくい内容の書き込みですみませんでした。

挿入位置ですが、(だいたい)合ってます。
わたしの書いたコードは、構文自体に間違いはまったくないはずです。
しかし、挿入した内容ですが、そのまま上の内容をコピーしたってことはないですよね。
したなら、”<--.*”ってところは削除または、コメントアウトしてますよね。(^^;
(#とコメントにしなかったのは、ちょっと思いやりのない書き方でした。)

print "Content-type: text/html\n\nMAX CONTENT_LENGTH ERROR.\n";
質問者 rannko  [削除]  投稿日 4/16(火) 08:50:09
今夜はやすださん、ありがとうございました。
おかげさまで、改善しました。
感謝感謝です。

このページは終了したので返信(回答)は書きこめません

Web裏技