NonSoft

のん掲示板(perl)


 ダウンロード

汎用的(不特定用途対応)な掲示板

ダウンロード 
#---------------------------------------------------------------------
# ファイル名:NONbbs.cgi:のん掲示板 Ver1.06
#
# 更新履歴:
# 2002.01.01 Ver1.00 初版。              作成者(のん)
# 2002.01.02 Ver1.01 ゴミとして残っている
#                    返信メッセージを削除する処理追加 変更者(のん)
# 2002.03.02 Ver1.02 コメント修正           変更者(のん)
# 2002.03.09 Ver1.03 メンバーパスワードをクッキー設定
#                    しない様に変更し、セキュリティー
#                    を高める             変更者(のん)
# 2002.03.10 Ver1.04 HTMLテンプレート不正指定禁止 変更者(のん)
# 2002.03.21 Ver1.05 クロスサイトスクリプティング対応 変更者(のん)
# 2002.03.25 Ver1.06 クロスサイトスクリプティング対応 変更者(のん)
# 2002.03.25 Ver1.06 open関数でのコマンド実行の禁止  変更者(のん)
#
# Copyright (c) 2001 のん
# 連絡先  :http://nonsoft.la.coocan.jp/
# 著作権  :著作権は放棄しません。
#       ファイル名の変更は禁止します。
#       使用・改造・再配布は制限しませんが、
#       改造したものを配布する場合は更新履歴をいれてください。
#
# 開発目標 :中小規模の汎用的(不特定用途対応)な掲示板を
#       目指しています。
#
# 機能概要 :概略としては以下の機能があります。
#       1.画面レイアウトを自由(ある程度)に変更できます。
#         (例)一覧表示、入力全項目表示
#         画面レイアウト用のHTMLテンプレートにより画面表示
#         するため、HTMLの変更によって画面レイアウト変更が
#         ある程度、簡単に可能です。
#         この掲示板の仕様を理解する必要はありますがPerlの
#         プログラミング知識はいりません。
#         (私もPerlが得意な訳ではありませんが...)
#         Perlをご存知の方は機能追加が出来ます。
#       2.入力する項目を自由(ある程度)に選べます。
#         (1)タイトル
#         (2)名前
#         (3)年齢
#         (4)性別
#         (5)Eメール
#         (6)URL
#         (7)文字の色
#         (8)背景の色
#         (9)削除キー
#        (10)本文
#        (11)その他1
#        (12)その他2
#       3.トピック(最初の投稿)毎に返信を表示します。
#       4.1ページに表示するトピック件数をHTMLテンプレート
#         で変更出来ます。
#       5.SIDという単位で掲示板データを管理しますので、この
#         プログラム一つでタイトルの異なる複数の掲示板を運営出
#         来ます。
#       6.掲示板の基本機能として以下の機能を備えています。
#        (1)新規登録:新規トピックとして登録します。
#        (2)返信表示:(Re:)形式で入力項目を表示します。
#        (3)返信登録:返信表示したトピックに返信します。
#        (4)削除  :削除キーが一致した時に削除します。
#                トピックを削除すると返信登録したデータ
#                全てを削除します。
#       7.管理者機能として以下の機能を備えています。
#        (1)バックアップ
#           掲示板データをダウンロードします。
#        (2)管理者パスワード変更
#        (3)SID追加
#        (4)SID削除
#           運営していた掲示板が一時的にアクセス出来無くなり
#           ます。
#        (5)メンバー追加
#        (6)メンバー削除
#           メンバーを登録すると登録したメンバーのみ掲示板に
#           アクセス出来ます。
#           メンバー登録した掲示板にアクセスするとメンバーパ
#           スワード入力画面が表示され認証します。
#           認証にはクッキーを使用しています。
#       8.エラー表示
#         認証エラー等でエラーメッセージを表示しますが、セキュ
#         リティーのため、詳しいメッセージは表示しません。
#         ...と言うか面倒だった!?
#
# 関連ファイル  :この掲示板はHTMLテンプレートファイルが1つ
#          以上必要です。このCGI単体では動きません。
#          HTMLテンプレートファイルは"NONbbs.cgi"と同じ
#          ディレクトリに存在し、拡張子は".htm"または".html"
#          です。
#
# 管理ファイル  :(1)SIDファイル(data/sid_NONbbs.txt)
#             SIDを1行単位で複数記述します。
#             各行に改行が必要です。
#             管理者機能でも追加/削除出来ます。
#          (2)管理者パスワードファイル(data/passwd_NONbss.txt)
#             管理者パスワード1件のみを1行に記述します。
#             管理者パスワードの後ろに改行が必要です。
#             管理者機能でも変更出来ます。
#          (3)メンバーファイル(data/xxx_menber.txt)
#             xxxの部分は、SIDです。
#             メンバーを1行単位で複数記述します。
#             各行に改行が必要です。
#             管理者機能でも追加/削除出来ます。
#          (4)掲示板データファイル(data/xxx_NONbbs.txt)
#             xxxの部分は、SIDです。
#             掲示板データファイルです。
#             バックアップ機能でこのファイルをバックアップ
#             します。
#
# インストール方法:NONbbs.cgiと関連ファイルをCGIが動作するディレクトリ
#          に置きます。(サーバーがUNIXの場合は、
#          ".cgi"ファイルと".pl"ファイルに実行権を与えます。)
#          NONbbs.cgiと同じディレクトリにdataディレクトリを作成し
#          管理ファイルを置きます。
#          NONbbs.cgiをURL指定して起動するとデフォルトSIDで
#          動作します。
#
# 起動パラメータ :html---HTMLテンプレート(default="NONbbs.html")
#          sid----SID(default="etc")
#          sname--掲示板タイトル(default="掲示板")
#          sno----表示先頭トピック番号(default="0")
#
#   CGIの起動方法(例):
#    1行目:<form name="bbs"
#    2行目: action="http://xxx.xxx.xxx/NONbbs/NONbbs.cgi"
#    3行目: method="POST" target="_blank">
#    4行目:<input type="hidden" name="sid" value="etc">
#    5行目:<input type="hidden" name="sname" value="掲示板タイトル">
#    6行目:<a href="javaScript:document.bbs.submit()">掲示板タイトル</a>
#    7行目:</form>
#
#     (CGIの起動方法(例)の説明)
#      1〜3行目で、起動するCGIを指定しています。
#      4行目で、掲示板のSIDを指定しています。
#      5行目で、掲示板のタイトルを指定しています。
#      6行目で、掲示板へのリンクを指定しています。
#
# 関連ドキュメント:掲示板カスタマイズ用のマニュアルを作成予定です。
#          HTMLテンプレートの作成方法を記述します。
#
# 関連プログラム :(1)カウンタを表示する場合は、NONcount.cgiを
#             使用する事が出来ます。
#          (2)この掲示板にGIFイメージを表示する場合は、
#             NONimg.cgiを使用する事が出来ます。
#          関連プログラムについては、関連プログラムの仕様書を
#          参照してください。
#
#---------------------------------------------------------------------

1.HTMLテンプレートの作成方法
  のん掲示板は、HTMLテンプレート(テキストファイル)と
  CGI(Kjbbs.cgi)でデータのやり取りを行ない画面表示を
  行ないます。
  HTMLテンプレートの内容をそのままブラウザに表示する部分と、
  CGIが解釈してCGIが持っているデータと置き換えて表示する部分が
  あります。
  HTMLテンプレートとCGIでやり取りを行なうデータは以下の内容です。

  1.1 HTMLテンプレートからCGIへフォームで渡すデータ
      (1)起動情報
         html     :HTMLテンプレート(default="NONbbs.html")
         sid      :SID(default="etc")
         sname    :掲示板タイトル(default="掲示板")
         sno      :表示先頭トピック番号(default="0")

      (2)掲示板入力情報
         title    :タイトル
         name     :名前
         age      :年齢
         sex      :性別
         email    :Eメール
         url      :URL
         fgcol    :文字の色
         bgcol    :背景の色
         delkey   :削除キー
         msg      :本文
         etc1     :その他1
         etc2     :その他2

      (3)メンバーパスワード情報
         mempswd  :メンバーパスワード

      (4)ボタン情報
         save     :新規投稿ボタン
         delete   :削除ボタン
         res_save :返信投稿ボタン
         res_dsp  :返信表示ボタン
         selno    :削除または返信表示、返信投稿するメッセージのNo.

      (5)管理者機能情報
         mngpswd  :管理者パスワード
         mngpswd1 :管理者パスワード変更1
         mngpswd2 :管理者パスワード変更2
         chgval   :その他の管理者情報変更データ
              (SIDまたはメンバーパスワード)
         mngmenu  :管理者機能ID
              backup  :バックアップ
              pswdchg :パスワード変更
              sidadd  :SID追加
              siddel  :SID削除
              memadd  :メンバー追加
              memdel  :メンバー削除

  1.2 HTMLテンプレートをCGIが解釈するデータ
     (1)CGIは以下のキーワードを解釈し、CGIで持っているデータ
        置き換えて掲示板を表示します。
        <!--bbs_cgi-->  :CGIファイル名

     (2)CGIは以下のキーワードを解釈し、HTMLテンプレートから
        フォームで渡された情報と置き換えて掲示板を表示します。
        <!--html-->     :HTMLテンプレート
        <!--sid-->      :SID
        <!--sname-->    :掲示板タイトル
        <!--sno-->      :表示先頭トピック番号
        <!--selno-->    :削除または返信表示、返信投稿するメッセージのNo.

     (3)CGIは以下のキーワードを解釈し、現在の掲示板表示から
        前ページと次ページを計算した値と置き換えて掲示板を表示します。
        <!--before_no--> :前ページの先頭メッセージ番号
        <!--next_no-->   :次ページの先頭メッセージ番号

     (4)CGIは以下のキーワードを解釈し、掲示板メッセージ管理ファイル
        から取得したデータと置き換えて掲示板を表示します。
        投稿されたメッセージは、メッセージ管理ファイルと言うファイルに
        書きこまれています。
        <!--no-->             :メッセージ番号
        <!--parent-->         :親メッセージ番号(返信投稿以外はnoと同じ)
        <!--ip-->             :投稿IPアドレス
        <!--yyyy-->           :投稿日(年)
        <!--yyyymm-->         :投稿日(年月)
        <!--yyyymmdd-->       :投稿日(年月日)
        <!--yyyymmddhh-->     :投稿日(年月日時)
        <!--yyyymmddhhmm-->   :投稿日(年月日時分)
        <!--yyyymmddhhmmss--> :投稿日(年月日時分秒)
        <!--title-->          :タイトル
        <!--name-->           :名前
        <!--age-->            :年齢
        <!--sex-->            :性別
        <!--email-->          :Eメール
        <!--emaillink-->      :名前にmailtoのリンクを貼った形式
        <!--url-->            :URL
        <!--urllink-->        :”URL”という文字にリンクを貼った形式
        <!--msg-->            :本文
        <!--fgcol-->          :文字の色
        <!--bgcol-->          :背景の色
        <!--delkey-->         :削除キー
        <!--etc1-->           :その他1
        <!--etc2-->           :その他2

     (5)その他の掲示板表示制御情報
        <!--main_loop=(xx)-->  :HTMLのこの位置から<!--/main_loop-->
                    までをメッセージを表示するためのループ
                    となる事をCGIに知らせる。
                    xxは1ページに表示するトピック数。
                    (4)で記述したキーワードを解釈する。
        <!--/main_loop-->
        <!--res_loop-->        :HTMLのこの位置から<!--/res_loop-->
                    までを各トピックに対する返信メッセージ
                    を表示するためのループとなる事をCGI
                    に知らせる。
        <!--/res_loop-->

        <!--resmode_if-->      :HTMLのこの位置から<!--/resmode_if-->
                    までを返信モード時のみ表示する事を
                    CGIに知らせる。
                    (例)返信投稿ボタン
        <!--/resmode_if-->

        <!--before_if-->       :HTMLのこの位置から<!--/before_if-->
                    までを前ページに表示するメッセージが有る
                    時のみ表示する事をCGIに知らせる。
                    (例)前ページボタン
        <!--/before_if-->

        <!--next_if-->         :HTMLのこの位置から<!--/next_if-->
                    までを次ページに表示するメッセージが有る
                    時のみ表示する事をCGIに知らせる。
                    (例)次ページボタン
        <!--/next_if-->

2.HTMLテンプレート(例)
     1行目:<html>
     2行目:<head>
     3行目:<title><!--sname--></title>
     4行目:<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
     5行目:<style type="Text/Css">
     6行目:<!--
     7行目:li.oItem { color: #000000; cursor: text; font-size: 11pt; } ;
     8行目:ul ul { display: none; font-size: 11pt; } ;
     9行目:A{
    10行目:	Color:#000000;
    11行目:	text-decoration: underline;
    12行目:}
    13行目:A:hover{
    14行目:	Color:#FF0000;
    15行目:	text-decoration: underline;
    16行目:}
    17行目:-->
    18行目:</style>
    19行目:<script language="JavaScript">
    20行目:<!--
    21行目:function initDsp(){
    22行目:	document.bbs_post.title.focus();
    23行目:}
    24行目:function bbsCheck(){
    25行目:	if( document.bbs_post.name.value == "" ){
    26行目:		alert("(*)が付いた項目は必ず入力してください。");
    27行目:		document.bbs_post.name.focus();
    28行目:		return false;
    29行目:	}
    30行目:	if( document.bbs_post.msg.value == "" ){
    31行目:		alert("(*)が付いた項目は必ず入力してください。");
    32行目:		document.bbs_post.msg.focus();
    33行目:		return false;
    34行目:	}
    35行目:	return true;
    36行目:}
    37行目:function bbsHtmlChg(param){
    38行目:	document.bbs_post.html.value = param;
    39行目:	document.bbs_post.submit();
    40行目:	return true;
    41行目:}
    42行目:function bbsPageChg(param){
    43行目:	document.bbs_post.sno.value = param;
    44行目:	document.bbs_post.submit();
    45行目:	return true;
    46行目:}
    47行目://-->
    48行目:</script>
    49行目:</head>
    50行目:<body background="NONimg.cgi" bgcolor="#FFFFFF" topmargin="5" leftmargin="5" text="#000000">
    51行目:<center>
    52行目:<form name="bbs_post" action="<!--bbs_cgi-->" method="POST" onSubmit="return bbsCheck()">
    53行目:<input type="hidden" name="html" value="<!--html-->">
    54行目:<input type="hidden" name="sid" value="<!--sid-->">
    55行目:<input type="hidden" name="sname" value="<!--sname-->">
    56行目:<input type="hidden" name="sno" value="<!--sno-->">
    57行目:<input type="hidden" name="selno" value="<!--selno-->">
    58行目:<table>
    59行目:  <tr>
    60行目:    <td nowrap colspan="4" background="NONimg.cgi?img=NONbbs_title.gif">
    61行目:      <center>
    62行目:        <font color="#FFFFFF"><font size="5">
    63行目:          <i>  ★★★ <!--sname--> ★★★  </i>
    64行目:        </font></font>
    65行目:        <img src="../NONcount/NONcount.cgi?sid=<!--sid-->&ino=0"> 
    66行目:      </center>
    67行目:    </td>
    68行目:  </tr>
    69行目:  <tr>
    70行目:    <td nowrap colspan="4" >
    71行目:      <center><font size="2">
    72行目:      (*)<i>が付いた項目は必ず入力してください。</i>
    73行目:      </font>
    74行目:      </center>
    75行目:    </td>
    76行目:  </tr>
    77行目:  <tr>
    78行目:    <td nowrap>タイトル</td>
    79行目:    <td nowrap><input type="text" name="title" value="<!--title-->" size=40 maxlength=50></td>
    80行目:    <td nowrap>名前(*)</td>
    81行目:    <td nowrap><input type="text" name="name" value="" size=40 maxlength=50></td>
    82行目:  </tr>
    83行目:  <tr>
    84行目:    <td nowrap>Eメール</td>
    85行目:    <td nowrap><input type="text" name="email" value="" size=40 maxlength=50></td>
    86行目:    <td nowrap>URL</td>
    87行目:    <td nowrap><input type="text" name="url" value="http://" size=40 maxlength=50></td>
    88行目:  </tr>
    89行目:  <tr>
    90行目:    <td nowrap>本文(*)</td>
    91行目:    <td nowrap colspan="3"><textarea name="msg" value="" cols=70 rows=3 wrap="hard"><!--msg--></textarea></td>
    92行目:  </tr>
    93行目:  <tr>
    94行目:    <td nowrap colspan="4">
    95行目:      削除キー<input type="password" name="delkey" value="" size=5 maxlength=10> 
    96行目:      文字の色<select name="fgcol" size="1">
    97行目:        <option value="000000">標準</option>
    98行目:        <option value="009900">緑</option>
    99行目:        <option value="0000ff">青</option>
   100行目:        <option value="000000">黒</option>
   101行目:        <option value="ffffff">白</option>
   102行目:      </select> 
   103行目:      <input type="submit" name="save" value="新規投稿">
   104行目:<!--resmode_if-->
   105行目:      <input type="submit" name="res_save" value="返信投稿">
   106行目:<!--/resmode_if-->
   107行目:      <input type="reset"  name="reset" value="リセット"> 
   108行目:      <a href="javascript:bbsHtmlChg('NONbbs_l.html')"><リスト表示></a>
   109行目:    </td>
   110行目:  </tr>
   111行目:</table>
   112行目:<hr>
   113行目:</form>
   114行目:
   115行目:<table width="80%">
   116行目:<tr><td>
   117行目:<!--main_loop=3-->
   118行目:  <table width="100%">
   119行目:    <tr><td colspan="2">
   120行目:      <form name="bbs_list<!--no-->" action="<!--bbs_cgi-->" method="POST">
   121行目:        <input type="hidden" name="html" value="<!--html-->">
   122行目:        <input type="hidden" name="sid" value="<!--sid-->">
   123行目:        <input type="hidden" name="sname" value="<!--sname-->">
   124行目:        <input type="hidden" name="sno" value="<!--parent-->">
   125行目:        <input type="hidden" name="selno" value="<!--no-->">
   126行目:        <table width="100%" border=1>
   127行目:          <tr>
   128行目:            <td nowrap width="1%">No.<a href="javaScript:document.bbs_list<!--no-->.submit()"><!--no--></a></td>
   129行目:            <td nowrap>
   130行目:              <input type="submit" name="res_dsp" value="返信">
   131行目:              <input type="submit" name="delete" value="削除">
   132行目:              削除キー<input type="password" name="delkey" value="" size=5 maxlength=10> 
   133行目:            </td>
   134行目:            <td nowrap>投稿日</td>
   135行目:            <td nowrap><!--yyyymmddhhmm--> </td>
   136行目:          </tr>
   137行目:          <tr>
   138行目:            <td nowrap>タイトル</td>
   139行目:            <td><!--title--> </td>
   140行目:            <td nowrap>名前</td>
   141行目:            <td width="50%"><!--emaillink-->  <!--urllink--></td>
   142行目:          </tr>
   143行目:          <tr>
   144行目:            <td nowrap>本文</td>
   145行目:            <td colspan="3"><font color="#<!--fgcol-->"><!--msg--> </font></td>
   146行目:          </tr>
   147行目:        </table>
   148行目:      </form>
   149行目:    </td></tr>
   150行目:
   151行目:    <!--res_loop-->
   152行目:    <tr><td>  </td><td>
   153行目:      <form name="bbs_list<!--no-->" action="<!--bbs_cgi-->" method="POST">
   154行目:        <input type="hidden" name="html" value="<!--html-->">
   155行目:        <input type="hidden" name="sid" value="<!--sid-->">
   156行目:        <input type="hidden" name="sname" value="<!--sname-->">
   157行目:        <input type="hidden" name="sno" value="<!--parent-->">
   158行目:        <input type="hidden" name="selno" value="<!--no-->">
   159行目:        <table width="100%" border=1>
   160行目:          <tr>
   161行目:            <td nowrap width="1%">No.<a href="javaScript:document.bbs_list<!--no-->.submit()"><!--no--></a></td>
   162行目:            <td nowrap>
   163行目:              <input type="submit" name="res_dsp" value="返信">
   164行目:              <input type="submit" name="delete" value="削除">
   165行目:              削除キー<input type="password" name="delkey" value="" size=5 maxlength=10> 
   166行目:            </td>
   167行目:            <td nowrap>投稿日</td>
   168行目:            <td nowrap><!--yyyymmddhhmm--> </td>
   169行目:          </tr>
   170行目:          <tr>
   171行目:            <td nowrap>タイトル</td>
   172行目:            <td><!--title--> </td>
   173行目:            <td nowrap>名前</td>
   174行目:            <td width="50%"><!--emaillink-->  <!--urllink--></td>
   174行目:          </tr>
   176行目:          <tr>
   177行目:            <td nowrap>本文</td>
   178行目:            <td colspan="3"><font color="#<!--fgcol-->"><!--msg--> </font></td>
   179行目:          </tr>
   180行目:        </table>
   181行目:      </form>
   182行目:    </td></tr>
   183行目:    <!--/res_loop-->
   184行目:  </table>
   185行目:<!--/main_loop-->
   186行目:</td></tr>
   187行目:</table>
   188行目:
   189行目:<!--before_if-->
   190行目:<a href="javaScript:bbsPageChg('<!--before_no-->')"><前へ></a>
   191行目:<!--/before_if-->
   192行目:<!--next_if-->
   193行目:<a href="javaScript:bbsPageChg('<!--next_no-->')"><次へ></a>  
   194行目:<!--/next_if-->    
   195行目:
   196行目:<font color="#888888" size="2">
   197行目:<form name="bbs_mng" action="<!--bbs_cgi-->" method="POST">
   198行目:<input type="hidden" name="html" value="<!--html-->">
   199行目:<input type="hidden" name="sid" value="<!--sid-->">
   200行目:<input type="hidden" name="sname" value="<!--sname-->">
   201行目:<input type="hidden" name="sno" value="<!--sno-->">
   202行目:<input type="hidden" name="selno" value="">
   203行目:<hr>
   204行目:管理機能<select name="mngmenu" size="1">
   205行目:<option value="backup">バックアップ</option>
   206行目:<option value="pswdchg">パスワード変更</option>
   207行目:<option value="sidadd">SID追加</option>
   208行目:<option value="siddel">SID削除</option>
   209行目:<option value="memadd">メンバー追加</option>
   210行目:<option value="memdel">メンバー削除</option>
   211行目:</select>
   212行目:新パスワード<input type="password" name="mngpswd1" value="" size=5 maxlength=10>
   213行目:<input type="password" name="mngpswd2" value="" size=5 maxlength=10>
   214行目:SID/メンバー<input type="text" name="chgval" value="" size=5 maxlength=10>
   215行目:管理者パスワード<input type="password" name="mngpswd" value="" size=5 maxlength=10>
   216行目:<input type="submit" name="manage" value="実 行">
   217行目:<hr>
   218行目:</form>
   219行目:</font>
   220行目:
   221行目:</center>
   222行目:</body>
   223行目:</html>

    (HTMLテンプレート(例)の説明)
     1〜20行目目までは普通のHTML&ジャバスクリプトです。
     21〜23行目までは、初期表示でタイトル入力エリアにカーソルを
     移動するものです。
     24〜36行目までは、必須項目のチェックです。
     37〜41行目までは、リスト表示用のHTMLテンプレートに
     切り替えるものです。
     42〜26行目までは、前ページ、次ページを切り替えるものです。
     51行目は、掲示板のバックグランドイメージをNONimgで表示して
     います。
     52〜57行目までは、CGI名やその他の起動情報を設定しています。
     79行目は、返信表示用のタイトルを引用しています。
     91行目は、返信表示用の本文を引用しています。
     104〜106行目までは、返信モード用の「返信投稿」ボタンを
     表示しています。
     117行からは、メインの投稿(トピック)のループを宣言して
     います。
     118〜185行目までは、メインの投稿(トピック)の表示フォーマット
     を記述しています。
     151行からは、返信投稿のループを宣言しています。
     151〜183行目までは、返信投稿の表示フォーマットを記述しています。
     189〜191行目までは、前ページボタンを表示しています。
     196〜219行目までは、管理者機能を表示しています。

                                −以上−