Select language: ( )English || (*)Japanese

wb.cgi "らくがき" 解説

  1. 概要
  2. 設置の手順
    1. ファイルを入手する
    2. wb.cgiの内容を確認設定
      1. wb.cgiの最初の行のperlのパスを指定
      2. wb.cgiの各種変数を設定
    3. 表示の雛型となるテンプレートファイルを変更
      1. standard.htmlを編集して見栄えデザイン
      2. helpe.html, help.htmlを編集して解説をデザイン
      3. wbpw.htmlを編集してパスワード入力ページをデザイン
    4. ファイルをwebサーバのしかるべき場所に転送
      1. 設置するディレクトリを作成
      2. ファイル転送,パーミッション設定
      3. データファイルを置くディレクトリを作成
      4. ファイルアップロード用ディレクトリを作成
    5. おわり
  3. 運営管理
    1. 書き込みの削除
      1. データをロック
      2. dbをGET
      3. dbを編集
      4. dbをPUT
      5. データをアンロック
  4. 保護
  5. BUGS
  6. 履歴
橘心女学院熊本校 トップページへ

1. 概要

wb.cgi "らくがき" は,俗に言う webの掲示板 です.

長所

短所

どのようなものかは,実際に落書きで試してください.

なお,当然ですがフリーです. 勝手に自分のホームページに設置しちゃってかまいません. 好きに改造しまくってもOK!

橘心女学院熊本校 トップページへ

2. 設置の手順

2.1. ファイルを入手する

まず,次の配布パッケージをダウンロードしてください. Webブラウザでリンクで右クリックして, 「リンクを名前をつけて保存」(Save link as)を選択.

配布パッケージ

次のファイル構成表では最新版を見ることができます.

ファイル構成表
ファイル パーミッション ※1 内容
wb.cgi ※2 rwxr-xr-x (755) メインとなるCGIスクリプト
config.pl ※3 rwxr-xr-x (755) 設定ファイル
wb.cgiを変更してくても, このファイルでほとんどの設定を変えることができます.
配布アーカイブには config.txtという名前で サンプルが入っています. 以前の設定が必要ない場合は、 このファイルをconfig.plにリネームして、 管理者用パスワード等を設定して使用するといいでしょう.
jcode.pl rwxr-xr-x (755) 日本語コード変換ライブラリ by Kazumasa Utashiro
htmlck.pl rwxr-xr-x (755) かんたんなHTML文法チェックライブラリ
cgi-lib.pl rwxr-xr-x (755) ファイルアップロード用のmultipart-form解析ライブラリ by Steven E. Brenner The cgi-lib.pl Home Page
ftype.pl rwxr-xr-x (755) ファイルアップロード用のファイルタイプ解析ライブラリ
standard.html rw-r--r-- (644) 出力するHTMLのテンプレート
標準だと このファイルに記述された形式でWebページをデザインして出力しますが, $template を変更して他のファイルにすることもできます
正確にはstandard.htmlと決まっているわけでなく、 @templatesの最初に定義してあるファイルです
notable.html rw-r--r-- (644) 出力するHTMLのテンプレート その2
Tableを使用しない表示スタイルです
japanese.html rw-r--r-- (644) 出力するHTMLのテンプレート その3
日本語だけの表示です
english.html rw-r--r-- (644) 出力するHTMLのテンプレート その4
英語だけの表示です
minibbs.html rw-r--r-- (644) 出力するHTMLのテンプレート その5
MiniBBSっぽい表示です
minibbs9.html rw-r--r-- (644) 出力するHTMLのテンプレート その6
MiniBBS v9っぽい表示です
imode.html
imodew.html
rw-r--r-- (644) 出力するHTMLのテンプレート その7
DocomoのiMODE携帯電話からアクセスする場合など、 User AgentがMozillaでないときに出力するHTMLのテンプレート
$templatei を変更して他のファイルにすることもできます
正確にはimode.htmlと決まっているわけでなく、 @templatesの最初に定義してあるファイルです
imodew.htmlは投稿時のテンプレート
compact.html rw-r--r-- (644) 出力するHTMLのテンプレート その8
コンパクトな表示
help.html rw-r--r-- (644) ヘルプのテンプレート
helpe.html rw-r--r-- (644) 英文ヘルプのテンプレート
wbpw.html rw-r--r-- (644) パスワード入力画面の雛型 (Member mode ※4のときだけ必要)
wb.gif rw-r--r-- (644) らくがきのロゴ画像 standard.htmlを変更して自分とこに この画像を置いときたい人だけお持ち帰りください.
bg.gif rw-r--r-- (644) 背景画像 標準のstandard.htmlで使用している背景イメージです.
nshelp.gif rw-r--r-- (644) Netscape画面イメージ 解説用の画像です.
nghost rw-r--r-- (644) 投稿を禁止するホストのIPもしくはドメイン名のリストを格納したファイル
初期設定で@nghostsに登録されている.
ngword spamsub spamlist spambody rw-r--r-- (644) 投稿を禁止する語句のリストを格納したファイル
初期設定で@ngfilesに登録されている.
※1 パーミッション
上記のファイルやディレクトリのパーミッションは, どんなwebサーバでもとりあえず動作させるためのものです. よりセキュリティを高めるためには, CGIが動作する範囲内でできるだけ最小の許可を 設定しましょう. 詳しくは,保護の章を参照してみてください.
※2 wb.cgi
wb.cgiは,そのままの名前だとCGIとして実行されてしまうので, wb.txtと名前を変えてあります. 入手後にwb.cgiに名前を変えてください.
※3 config.pl
都合により,config.txtと名前を変えてあります. config.plに名前を変えてください.
※4 Member mode
パスワードを知ってる人だけが掲示板を読み書き出来るモードです. 会員制の掲示板?ってあるのかな? なお,保護の章を読んで理解し, 適切にパーミッションを設定し Secure modeで運営しなければ, このモードでもCGIの達人には覗かれる恐れがあります.

2.2. wb.cgiの内容を確認設定

2.2.1. wb.cgiの最初の行のperlのパスを指定

wb.cgiをテキストエディタで編集して, 最初の行の#!の後ろの /usr/local/bin/perl5等と書かれてる部分を 設置するwebサーバで許可されてるperlのパスに変更します.
perlは, version 4 でも version 5 でも どちらでも動作するように作ってるつもりなのですが, なぜか version 4ではcoredumpしてしまうことがあります.
よくわからなかったら /usr/local/bin/perl5とか /usr/local/bin/perlとか /usr/bin/perl5とか /usr/bin/perl等を試してみてください.

2.2.2. wb.cgiの各種変数を設定

それから,以下の変数を設定してるところを適切な値に変更します. コメントに(*)マークがついてるとこです.

v1.3から,以下の設定のほとんどは, config.plで設定できるようになりました! wb.cgiを編集して設定を変更するよりも. config.plで設定するほうがよいでしょう. 特に,日本語を使用する場合は config.plで設定したほうがいいです. config.plは事前に文字コードをEUCに変換してから evalされます.

$rootpasswd
管理者のパスワード
パスワードとして使用できる文字は,半角アルファベットと数字だけです.
$userpasswd
普通のユーザーのアクセス用パスワード
パスワードとして使用できる文字は,半角アルファベットと数字だけです. $userpasswd = ''; # Public mode こうするとだれでもアクセスできる
$userpasswd = 'foo'; # Member mode このパスワードを知ってる人だけ
$dbdir
データファイルを置くディレクトリです. (初期設定ではdb)
Member modeで運用する場合には初期設定から変更したほうがよいでしょう.
$secure
Secure mode (安全なモード)で運営するかどうかです.
0 だと Insecure mode (楽天的なモード), 1 だと Secure mode (安全なモード) になります. ただし,Secure modeによって管理されるのは 新しく作成されるデータファイルのパーミッションだけです. wb.cgi自体のパーミッションを適切に設定しておかなければ意味がありません.
$author
貴方の名前 (テンプレートの%author%がこれに置換されます)
$email
貴方のE-mail address (テンプレートの%email%がこれに置換されます)
$top
貴方のホームページのURL (テンプレートの%top%がこれに置換されます)
$tope
貴方の英文のホームページのURL (テンプレートの%tope%がこれに置換されます)
Sorry, Japanese onlyなどという自己矛盾した英語 を使う人は,
$tope = '';
というふうに空の文字列を設定してください.
$topi
貴方のiMODEのホームページのURL (テンプレートの%topi%がこれに置換されます)
$dbfilemax
データファイルの最大個数 (0で無制限)
(ファイルを分割しといてアクセスを高速化するための布石)
$dbsizemax
データファイルの最大バイト数 (0で無制限)
データファイルがこれ以上のサイズになると, dbdb0001, db0001db0002, ... とrenameされ,新しいdbが作成されます.
したがって, 書き込みまれたデータを保存するために使用されるディスク容量は(最低でも) $dbsizemax * $dbfilemaxバイトとなります.
$artsizemax
書き込みの最大バイト数 (0で無制限)
$maximgwidth
画像の表示横幅の最大ピクセル数
投稿された画像の横幅がこの値を超える場合、 この値以下になるように縮小して表示されます. (0なら縮小しない)
$maximgheight
画像の表示縦幅の最大ピクセル数
投稿された画像の縦幅がこの値を超える場合、 この値以下になるように縮小して表示されます. (0なら縮小しない)
@nghosts
投稿を禁止するホストのIPもしくはドメイン名のリストを格納したファイルのリスト. ここに列挙されているファイルが存在した場合、 その中に記述されているIPアドレスやドメイン名からの投稿を禁止します. 詳しい記述ルールは、 nghostのコメントを参照してください.
初期設定は("nghost")
@ngfiles
投稿を禁止する特定の語句のリストを格納したファイルのリスト. ここに列挙されているファイルが存在した場合、 その中に記述されている語句を本文やメールアドレスに含む投稿を禁止します. 詳しい記述ルールは、 nghostと同じです.
初期設定は("ngword", "spamsub", "spamlist", "spambody")
$template
出力するHTMLの雛型となるファイル.
特に指定が無ければこのテンプレートファイルに従って表示します. 定義されていない場合@templateの最初のものが使用されます.
$templatei
iMODEの携帯電話からアクセスした場合など、 UserAgentがMozillaでないときに 出力するHTMLの雛型となるファイル.
定義されていない場合@templateの2番目のものが使用されます.
@template
出力するHTMLの雛型となるファイルのリスト
$cookietime
クッキーの賞味期限.
初期設定では 60*60*24*31秒 つまり 31日間です.
$denc
投稿した記事を保存しておくデータベースファイルの文字エンコーディング. Shift-JISで保存したいならsjis, JISで保存したいならjis, EUCで保存したいならeuc という値を設定します. 初期設定ではsjisになっています.
v1.5から初期設定ではsjisに変更されました. これ以前のものは,jisが初期設定となってます.
$head_title
<head><title>〜</title></head> の中に埋め込まれるタイトル文字列. 初期設定はWhiteboard
ここでは,日本語とかは使わずにASCII文字列だけ使っておくのが無難でしょう. もちろんHTMLタグは使用できません.
$body_title_en
英語のページenglish.htmlで最初に表示されるタイトル文字列. 初期設定は$head_titleと同じ.
<h1>と<a>の中に埋め込まれますから, その中で使えるHTMLタグしか使わないようにしましょう.
$body_title_ja
日本語のページjapanese.htmlで最初に表示されるタイトル文字列. 初期設定は落書するべからず!
<h1>と<a>の中に埋め込まれますから, その中で使えるHTMLタグしか使わないようにしましょう.
$body_title
標準の表示スタイルstandard.htmlで最初に表示されるタイトル文字列. 初期設定は$body_title_en
$body_title_ja
. <h1>と<a>の中に埋め込まれますから, その中で使えるHTMLタグしか使わないようにしましょう.
$stylesheet
<head>〜</head> の最後の方に埋め込まれる文字列. 初期設定はなし.
スタイルシートファイルの指定とか, 直にCSSを記述したかったら,これに設定しておくといいと思います.

2.3. 表示の雛型となるテンプレートファイルを変更

2.3.1. テンプレートファイルを編集して見栄えデザイン

ブラウザで standard.htmljapanese.htmlを 表示してみるとわかりますが, 表示スタイルは,これらのテンプレートファイルで定義されてます. 文字の色とか背景色などの簡単な変更であれば, $stylesheetでスタイルシートを設定することで可能ですが, もっと大幅に表示スタイルを変えたい場合には, これらのテンプレートファイル自体を自分で作成することになります.

もちろん,何もない状態から作るのは大変ですから, standard.htmljapanese.htmlなどの 最初から用意されているものをコピーして それを変更するという作り方がいいかと思います. 編集にはできるだけテキストエディタを使用してください. (HTMLエディタだと勝手に内容が変更される可能性があるため)

新しいテンプレートを作ったら, config.pl@templateにそのテンプレートファイルを追加します. たとえば,mystyle.htmlという テンプレートファイルを作ったら次のような内容を @templateに追加します.

     "mystyle.html	  My-style	*私らしく",

%%なんとか_begin%% ... %%なんとか_end%%は, 条件つき出力等の制御のための文字列です. %なんとか%は, しかるべき文字列に置換されます. よくわからない人は,これらは変更しないようにしましょう!

2.3.2. helpe.html, help.htmlを編集して解説をデザイン

helpe.html, help.htmlは, それぞれ[HELP] [解説]で表示されるHTMLのテンプレートです. 変更しなくてもそれなりに書き込み方法について解説してありますが, より詳しくとか解りやすく解説したい場合にはこのファイルを編集してください. このファイルも実際に表示されるときには, %なんとか%は, しかるべき文字列に置換されます.

2.3.3. wbpw.htmlを編集してパスワード入力ページをデザイン

wbpw.htmlは, Member mode(特定の人だけアクセスできるモード)の パスワード入力ページのテンプレートです. $userpasswdに空でない文字列を設定してMember modeにしたら, このテンプレートファイルを編集してパスワード入力画面をデザインしてください. サンプルのwbpw.htmlのままだと パスワードがバレバレです.


2.4. ファイルをWebサーバのしかるべき場所に転送

2.4.1. 設置するディレクトリを作成

まず, 設置したいwebサーバの貴方のホームページを置いているディレクトリ (多くのサーバではpublic_html)に 掲示板用のディレクトリを作成します. パーミッションは,rwxr-xr-x (755)にしてください.

サーバによっては,CGIを実行可能なディレクトリはcgi-binだけという ことがあるかもしれませんが, その場合には,そのCGIを実行可能なディレクトリを使用してください.

2.4.2. ファイル転送,パーミッション設定

そして,その掲示板用のディレクトリにファイルを転送します. 画像ファイル 何とか.gifは バイナリモードで, それ以外のファイルは テキスト(ASCII)モードで転送したほうがいいでしょう.

ファイルを転送したら, ファイル構成表のとおりに 転送したファイルのパーミッションを設定してください.

2.4.3. データファイルを置くディレクトリを作成

次に, その掲示板用のディレクトリにデータファイルを置くディレクトリを作成します. dbという名前のディレクトリ ($dbdirを変更した場合は,その名前のディレクトリ) を作成してください. このディレクトリのパーミッションは, rwxrwxrwx (777)に設定します.

CGIがファイルオーナーの権限で実行されるwebサーバの場合には, パーミッションを rwx------ (700)に設定するとより安全になります.

なお参考までに,掲示板を運用してくと, データファイルを置くディレクトリdbには, 以下のファイルが自動的に作成されてきます. ($dbfilemaxが20の場合)

作成されるデータファイル
ファイル パーミッション 内容
db??? 最新のデータ
db0001??? そのひとつ前のデータ (昔dbだったもの)
db0002??? そのふたつ前のデータ (昔々dbだったもの)
: : :
db0019??? その19個前のデータ (昔々々…dbだったもの)
index.html??? (Secure modeのときにindex.htmlが無ければ)

2.4.4. ファイルアップロード用ディレクトリを作成

画像などのファイルのアップロード機能を使用する場合には, データファイルを置くディレクトリ (初期設定ではdbというディレクトリ) にアップロードされたファイルを置いとくディレクトリを作成します.

db/file           drwxrwxrwx  ディレクトリ
db/file/incoming  drwxrwxrwx  ディレクトリ
db/file/log       -rwxrwxrwx  0バイトのファイル

2.5. おわり

試しになんか書き込んでうまくいけばおわり. うまくいかなかったら, 橘心女学院熊本校らくがきで 相談してください. 暇があればサポートします.

橘心女学院熊本校 トップページへ

3. 運営管理

3.1. 書き込みの削除

v0.08には書き込みの削除機能がつきました. New!
削除したい書き込みの頭にあるチェックボックスをチェックして. 下のほうにあるパスワード入力フィールドに 書き込んだ時の削除キーまたは管理者パスワードを入力し, その後の[Delete]ボタンを押すだけです. チェックされた書き込みが消えるハズです.

ということで, 以下の書き込み削除の説明は過去のものとなりました. 読みとばしてください.

直接データファイルを編集することで書き込みを削除することができます. webブラウザから対話的に削除する機能は, 現在サポートされてません. (これは単にインターフェイスをデザインするのがメンドクサイからです)

~/wb/db/dbのどこを削除するかは, ~/wb/db/dbを見てみればスグわかるはずです. 逆に言えば, 見てもわからない人は編集しないでください.

www.oersted.co.jpのように telnetしてMuleが使用可能なwebサーバでは, Muleから~/wb/db/dbをオープンして それを直に編集してかまいません. (Muleは編集中に他のプロセスによりファイルが変更されたら, セーブ時に警告するようになってるので安全です)

Muleなどが使えない場合には,ftpを使って次の手順で削除します.

3.1.1 データをロック

db.lckというファイルを データファイルを置いてるディレクトリに転送します. db.lckはどんなファイルでもいいです. (長さ0でもかまいません) とにかく,db.lckというファイルを データファイルを置いてるディレクトリに作成してください.

3.1.2 dbをGET

webサーバのデータファイルを置いてるディレクトリから dbをローカルにGETしてきます. 転送は,バイナリモード, 漢字コードは無変換を使用してください. (ほんとはなんでもいいのですが, 説明がめんどくさいので)

3.1.3 dbを編集

dbを編集して,削除したい書き込みを削除します. Windowsで編集するときは, Meadowを 使用するようにしてください. (他のテキストエディタでも, ちゃんと漢字コードや行末コードを処理できるものは 大丈夫だとは思いますが)

3.1.4 dbをPUT

編集したdbを データファイルを置いてるディレクトリに転送します. 転送は,バイナリモード, 漢字コードは無変換を使用してください. (ほんとはなんでもいいのですが, 説明がめんどくさいので)

3.1.5 データをアンロック

データファイルを置いてるディレクトリの db.lckというファイルを削除します. このファイルが存在してる間は書き込みがブロックされています.

橘心女学院熊本校 トップページへ

4. 保護

このCGIに限らず, CGIの実行がCGIファイルのオーナーの権限で実行されるwebサーバでないと データファイルを他のユーザーから保護することはできません. なぜなら, 他のユーザーが webサーバにあるファイルを表示するCGIを設置したら, CGIスクリプトやデータファイルの内容を知ることができるからです. (って,ホントに設置するなよ>オレ)

したがって, CGIスクリプトやデータファイルのオーナーを自分にして, パーミッションはオーナー以外のアクセスを禁止しておくことで データを保護することになります.

4.a. CGIがファイルオーナーの権限で実行される場合

wb.cgiのパーミッションは, rwx------ (700)にします.

config.plのパーミッションは, rw------- (600)にします.

データファイルを置くディレクトリ ($dbdirで指定してるディレクトリ) のパーミッションは, rwx------ (700)にします.

4.b. CGIが特定のユーザーの権限で実行される場合

このようなwebサーバでも, ファイルのSUIDビットをセットしておくと CGIがファイルオーナーの権限で実行される場合があります. 例えば,httpdにApacheを使用してる場合, なぜかperlのスクリプトだとSUIDを無視してnobodyの権限で実行しますが, Cコンパイラでコンパイルした実行ファイルはSUIDが有効のようです.

ですから, www.oersted.co.jpのように telnetログインできてCコンパイラが使える場合には, 以下の方法が使えます.

まず,wb.cgiの名前をwb.plに変更します. そのパーミッションは, rwx------ (700)にします.

次のようなCのソースファイル wb.cを作成します.

main()
{
  return system("/home/yav/public_html/bbs/wb.pl");
}

/home/yav/public_html/bbs の部分は、掲示板を設定する自分のディレクトリを絶対パスで指定してください。 相対パスで指定するとセキュリティホールになります。

それをコンパイルして実行ファイルを作り, そのパーミッションは, rwsr-xr-x (4755)にします.

  % cc wb.c -o wb.cgi
  % chmod 4755 wb.cgi

データファイルを置くディレクトリ ($dbdirで指定してるディレクトリ) のパーミッションは, rwx------ (700)にします.


5. BUGS

セキュリティホール

Version 1.13で設定ファイルのキャッシュを作成するようにしましたが、 このキャッシュファイルにセキュリティホールがありました!

症状
最初に設定ファイル config.plから そのキャッシュファイル config.pl.cacheを作成するが、 そのときはまだumaskの値が設定されてないので 生成されたキャッシュファイルを他人が見ることができる。
対策
生成されたキャッシュファイル config.pl.cacheのパーミッションを、 telnetやftpでrw------- (600)に変更する。

6. 履歴

Version 1.21 開発中

Version 1.20

Version 1.19

Version 1.18

Version 1.17

Version 1.16

Version 1.15

Version 1.14

Version 1.13

Version 1.12

Version 1.11

Version 1.10

Version 1.9

Version 1.8

Version 1.7

Version 1.6

Version 1.5

Version 1.4

Version 1.3

Version 1.2

Version 1.1

Version 0.08

Version 0.07

Version 0.06

Version 0.05


橘心女学院熊本校 トップページへ

yav <yav@bigfoot.com>