【スターサーバー】【Perl】掲示板CGIを動作させてみる

  • 投稿 : 2018-10-10

ネットにあるサンプルを動作させてみる

掲示板 その4 - CGI(Perl)の基本と掲示板作成 - ポンクソフト

上記の掲示板CGIを動作させてみます。

当サイトの著作物(ソフトウェア及び文書)は全てMIT Licenseとします。改造・再配布・商用利用、ご自由にどうぞ。
お問い合わせ - ポンクソフト

ちなみに、上記のソースのライセンスはMIT Licenseとなってます。

ソースを一部変更

print "Content-type: text/html; charset=Shift_JIS\n\n";

↑ 修正前
↓ 修正後

print "Content-type: text/html; charset=UTF-8\n\n";

UTF-8、改行コード(LF)のテキストで保存する =>スターサーバーにアップロード

cgi-lib.pl

上記の掲示板CGIでは、cgi-lib.plが用いられているので、別途用意する

The cgi-lib.pl Home Page

上記のサイトから、「Version 2.18 」のcgi-lib.plをDLしてきて、それをそのまま、スターサーバーにアップロード

その他

その他は、掲示板CGIが掲載させている通りにする

・cgi-lib.pl 、パーミッションは変更しないでOK
・bbs4.cgi パーミッションを755
・bbs4.txt 空ファイル、、パーミッションを666

この3つのファイルで動作します。

改造版を作ってみる

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use CGI;

# 掲示板 その4 改造版
print "Content-type: text/html; charset=UTF-8\n\n";

# フォーム部分を表示する
print <<EOF;
<html>
<body>
<h2>掲示板</h2>
<form method="post" action="bbs4.cgi">
<p><label>タイトル </label><input type="text" name="title" size="40"/></p>
<p><label>メッセージ </label><textarea name="message" cols="60" rows="5"></textarea></p>
<p><label>お名前 </label><input type="text" name="namae" size="30"/></p>
<p><label>e-mail </label><input type="text" name="mail" size="30"/></p>
<p><label>削除キー </label><input type="password" name="delkey" size="10"/></p>
<p><input type="submit" name="write" value="送信"/></p>
<hr/>
記事番号:<input type="text" name="delno" size="10"/>
削除キー:<input type="password" name="delkey2" size="10"/>
<input type="submit" name="delete" value="削除"/>
</form>
<hr/>
EOF

$form = CGI->new;
# フォームの値を取得
$namae = $form->param('namae');
$mail = $form->param('mail');
$title = $form->param('title');
$message =$form->param('message');
$delkey = $form->param('delkey');

# ログファイル読み込み
open(IN, "bbs4.txt");
@log = <IN>;
close(IN);

# フォームからの書き込みのときは書き込み処理を行なう
if ($form->param('write')) {
  # タグの無効化
  &deltag($namae);
  &deltag($mail);
  &deltag($title);
  &deltag($message);
  &deltag($delkey);

  # 改行を<br>に変換
  $message =~ s/\r\n/<br>/g;  # Windows系(\r\n)
  $message =~ s/\r/<br>/g;  # Mac系(\r)
  $message =~ s/\n/<br>/g;  # UNIX系(\n)

  # 現在時刻を取得
  $time = `date +'%Y/%m/%d %T'`;
  chop $time;

  #記事番号は前の番号+1
  ($no) = split(/\t/, $log[0]);
  $no++;

  # ログ先頭に書き込み内容を格納
  unshift @log, "$no\t$delkey\t$namae\t$mail\t$title\t$message\t$time\n";

  # ログ最大数を30件に制限
  splice @log, 30;
}

# フォームからの削除のときは記事削除処理を行なう
if ($form->param('delete')) {
  for ($i = 0; $i <= $#log; $i++) {
    ($no, $delkey) = split(/\t/, $log[$i]);
    if ($no eq $form->param('delno') and $delkey eq $form->param('delkey2')) {
      splice @log, $i, 1;
      break;
    }
  }
}

if ($form->param('write') or $form->param('delete')) {
  # ログファイルにロックをかけて書き込み
  open(OUT, "+< bbs4.txt");
  flock(OUT, 2);
  truncate(OUT, 0);
  seek(OUT, 0, 0);
  print OUT @log;
  close(OUT);
}

# ログ表示
foreach $data (@log) {
  chop $data;
  ($no, $delkey, $namae, $mail, $title, $message, $time) = split(/\t/, $data); 
  print "No.$no&nbsp;&nbsp;$title";
  print "&nbsp;&nbsp;投稿者:";
  if ($mail ne "") {print "<a href='mailto:$mail'>";}
  print $namae;
  if ($mail ne "") {print "</a>";}
  print "&nbsp;&nbsp;&nbsp;&nbsp;投稿時刻:$time";
  print "<br><br>\n";
  print "$message<br>\n";
  print "<hr>\n";
}

print "</body>\n</html>\n";

# タグを除去するサブルーチン
sub deltag {
  $_[0] =~ s/</&lt;/g;
  $_[0] =~ s/>/&gt;/g;
}

参考:
掲示板 その4 - CGI(Perl)の基本と掲示板作成 - ポンクソフト
https://ja.wikibooks.org/wiki/Perl/CGI

・cgi-lib.plの代わりに、標準ライブラリーに変更
・HTML出力のタグのところを変更

cgi-lib.plは、フォームの値を取得のところに使用しているので、その部分だけ書き換えます。ほんの少し変更するだけで、対応できます。

前:$form{
後:$form->param

上記のキーワードの部分をみれば、修正方法がわかるかと思います。

補足

この掲示板CGIですが、動作はしますが、サンプルだと思います。たとえば、すべて未入力でも投稿できてしまいます。

スポンサーリンク