Free CGI Perl PHP Script Olive Design CGI

一言メッセージ掲示板 その4

上のスプリクトに暗号化パスワード削除機能をつけました。

まず、ファイル名bbs01.cgiを作成し、下のソースを貼り付けてパーミションを755にします。 同じ階層に空のファイルlog.datを作成してパーミションを666にします。

サンプル

ソース bbs04.cgi

#!/usr/bin/perl
#
#初期設定項目

#最大ログ保存数
$data_max = 50;

#このスクリプトの場所
$this = "./bbs04.cgi";

#ログファイルの場所
$logfile = "./log.dat";

#1ページのコメント表示数
$comsize = 10;

#メイン処理
&decode;
if ($mode eq 'regist'){ ®ist; }
elsif ($mode eq 'delete'){ &delete; }
&html;

#html表示
sub html{
#ログファイル読み込み
  open(IN,"$logfile");
  @log = <IN>;
  close(IN);
print <<"HTML";
Content-type: text/html

<html><head><title>一言メッセージ</title></head>
<body>
<h3>一言メッセージを書いてください。</h3>
<form method="POST" action="$this">
<input type=hidden name=mode value="regist"><br>
入力 =>
<input type=text name="comment"><br>
パスワード<input type="password" name="password" size=10"><br>
<input type="submit" value="送信"></form><p>
HTML

  #コメント部分の表示
  $start = $page +1;
  $end   = $page + $comsize;
  $i= 0;
  foreach  $in (@log){
    $i++;
    if    ($i < $start){ next;}
    elsif ($i > $end  ){ next;}
    ($num,$comment,$password,$jptime) = split(/	/,$in);
    print "$num>  $comment<br>";
  }
  &next;
print <<"END";
$next $back $rest
$total
<br>
<form method="POST" action="$this">
<input type=hidden name=page value=$page><br>
<input type=hidden name=mode value=delete><br>
パスワード<input type="password" name=password size=10"><br>
削除番号<input type=text name=no size=4><br>
<input type=submit value=削除></form>
</p></body></html>
END
exit;
}
#デコード処理
sub decode{
  $method = $ENV{ 'REQUEST_METHOD' };
  if( $method eq 'GET' ) {
    $input = $ENV{ 'QUERY_STRING' };
  } 
  else {
    read( STDIN,$input,$ENV{ 'CONTENT_LENGTH' } );
  }
  @in = split(/&/,$input); 
  foreach  (@in) {
   ($list, $value) = split(/=/);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
   $form{$list} = $value;
  }
  $mode     = $form{'mode'};
  $comment  = $form{'comment'};
  $no       = $form{'no'};
  $page     = $form{'page'};
  $password = $form{'password'};
}
#ログファイルに書き込み
sub regist{
  if ($comment eq '' || $password eq ''){
    &error('エラー','コメントとパスワードを記入してください。')
  }
  #現在時間所得
  &time;
  open(IN,"$logfile");
  @log = <IN>;
  close(IN);
  $top = $log[0];
  ($top_no,$top_comment,$top_password,$top_jptime)
= split(/ /,$top); if ($top_comment eq $comment ){ &error('エラー','二重投稿禁止')} $no = $log[0] + 1 ; #パスワード暗号化 $salt = pack( "CC",int( rand(26) + 65 ),int(rand(26) + 97 )); $password = crypt( $password,$salt); $newdata = "$no $comment $password $jptime\n"; open(OUT,">$logfile"); unshift (@log,"$newdata"); #ログ保存数を設定($# は変数のインデックスの最大値を求める記述) if ($#log > ($data_max -1)){ $#log = $data_max -1;} print OUT @log; close(OUT); } #ログファイルから削除 sub delete{ if ($no eq '' || $password eq ''){ &error('エラー','削除番号とパスワードを記入してください。') } open(IN,"$logfile"); $pass_match = 0; foreach (<IN>) { ($log_no,$comment,$log_password,$jptime) = split(/ /); if($log_password eq crypt("$form{'password'}",
$log_password)){ $pass_match = 1; } # 削除ナンバー以外は保存 if (!($no == $log_no)){ push(@log,$_); } } if ($pass_match == 0){ &error('エラー','パスワードが違ってます。'); } close(IN); open(OUT,">$logfile"); print OUT @log; close(OUT); } #nextページ処理サブルーチン sub next { $next_page = $page + $comsize; $back_page = $page - $comsize; $page_total = int( ($#log ) / $comsize )+1; $page_rest = ($page / $comsize)+1; $page_all = ($#log +1) - ($page + $comsize); if ($page_all > O){ $total = "あと $page_all 件の書き込みがあります。"; } if ($back_page >= 0){ $next = "<a href=bbs04.cgi?page=$back_page>前のページ</a>"; } if ($next_page < $i){ $back = "<a href=bbs04.cgi?page=$next_page>次のページ</a>"; } $rest = "$page_rest/$page_total"; } #時間所得 sub time { ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time); $nitiji=sprintf("%04d年%02d月%02d日",$year+1900,$mon+1,$day); $jikan=sprintf( "%02d時%02d分",$hour,$min); $jptime=$nitiji.$jikan ; } #エラーメッセージ表示 sub error { print <<"HTML"; Content-type: text/html <html> <body> <b>$_[0]</b><br> $_[1] </body></html> HTML exit; } __END__
Perl PHP Free CGI Script OliveDesign CGI

Perl PHP Free CGI Script OliveDesign CGI

プライバシーポリシー / 特定商取引法に基づく表示