![]() |
カレッヂ |
質問者 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裏技 |