{{category Perl}} ---- ソース: {{ref GBS.pm}} !!概要 `GBS'は、`Guest Book System'の略です。Perl5で書かれたオブジェクト指向モジュールです。 HTTPを使ったゲストブックを設置するのに必要なCGIセッションを肩代わりします。 !主な機能 *300件までログを保存可能。 *フォーム上で最大表示件数を変更可能。過去ログも参照できます。 *さまざまなセキュリティ機能を搭載(詳細後述) **書き込みログの保存 **管理者は発言の削除が可能 **管理者モードでは、発言者の環境変数を確認可能。 **連続書き込み防止機能付き **アクセス制限・許可機能付き **最大書き込みデータ量の制限 !!動作環境 Perl 5.004以上 for UNIX一族(JPerlは不可)。 必須標準モジュール: Exporter.pm, CGI.pm インストールが必要なモジュール: jcode.pl 設置環境に、必須標準モジュールが提供されているかどうか確認して下さい。Perl5以上であれば、提供されているのが普通だと思います。 もしCGI.pmが提供されていなければ、自分で用意して下さい。ゲストブックを設置するディレクトリに一緒に置いておくだけです。 日本語はすべてEUCで扱っています。 表示メッセージもEUC。コメントもEUCなので、SJISとかに変えようとすると、たいへんめんどいことになります。 !!GBS.pmの設置 !設置のあらまし ゲストブックのプロパティを指定して決められたメソッドを呼び出すだけで、CGIセッションが行われます。なんのこっちゃ。まあ、人が設計したオブジェクトは使いにくいものです。 設置者は、CGIの手順について知っている必要はありません。 設置者は、UNIX系OSにおけるファイルシステムの概念を理解している必要があります。理解していない人は、自力では設置できません。 設置者は、Perlにおけるオブジェクト指向プログラミングについての知識があると楽です。とりあえずふつうにPerlを知っていれば難しくないでしょう。 !設置手順の流れ +モジュール・ファイルの設置 +GBS.pmが使用するディレクトリとファイルの設置 +コーディング +スクリプト・ファイルをサーバーへFTPで転送 +管理者登録 !モジュールの設置 まず、ゲストブックを設置したいディレクトリに、GBS.pmとjcode.plを置いて下さい。 もし、お使いのプロバイダがCGI.pmを提供していなければ、これも自分でここに置いておいて下さい。 これらのファイルのパーミッションは704(推奨)以上です。 次は、GBS.pmが使用するディレクトリとファイルの設置です。 !GBS.pmが使用するディレクトリとファイルの設置 ::管理者用ディレクトリとパスワードファイル :::管理者のパスワードを保存するためのディレクトリとファイルが必要です。パーミッションのあるディレクトリに掘ります。普通はゲストブック設置ディレクトリに掘ればよいでしょう。 :::パーミッション701のディレクトリを掘ります。そこに、パーミッション606の空ファイルを置いておきます。これらは、推測されにくい名前にしておくのがよいでしょう。 ::ログファイル用ディレクトリとログファイル :::書き込んだ内容を保存するためのディレクトリとファイルが必要です。作り方は管理者用ディレクトリのときと同じ要領です。 :::パーミッション701のディレクトリを掘ります。そこに、パーミッション606の空ファイルを置いておきます。これらは、推測されにくい名前にしておくのがよいでしょう。 ::ロックファイル用ディレクトリ :::GBS.pmには、ログファイルが壊れてしまわないよう、同時書き込みを防止するロック機構があります。そのためのディレクトリが必要です。 :::パーミッション703のディレクトリを掘ります。ここには、空ファイルを設置する必要はありません。ただディレクトリだけ作っておいて下さい。 次は、ゲストブックCGI本体のコーディングです。 !コーディングの手順 必ずしも理解できなくてもいいです。 +PerlのShebang(ex: #! /usr/local/bin/perl)を書きます。 +GBS.pmをuseします。 +必須プロパティを無名ハッシュの形で、クラスメソッドnewに渡し、ゲストブック・オブジェクトを作成します。 +ゲストブック・オブジェクトに対して、start, get_params, endの三つのメソッドを呼び出します。すると、自動的に1セッションが行われます。 具体例は以下を参照。 ::コーディング例 :::Shebangからexit文までを切り取ってお使い下さい。 :::''' 'ここに...を記す' '''の個所は、自分で設定する必要があります。 #! /usr/local/bin/perl use GBS.pm; # ここで指定している4つのプロパティは必須。 # これら無名ハッシュの値は、自分で適切な値を指定してください。 my $data = { 'cgi_Url' => 'ここにゲストブックのURLを記す', 'admin_FilePath' => 'ここに管理者パスワードファイルのパスを記す', 'log_FilePath' => 'ここにログファイルのパスを記す', 'lock_DirPath' => 'ここにロックファイル用ディレクトリのパスを記す', }; # プロパティを指定している無名ハッシュ$dataを、クラスメソッドnewに渡して # ゲストブック・オブジェクトを作成する。 my $guestbook = GBS->new($data); # ゲストブック・オブジェクトに対して以下の3つのメソッドを呼び出すと、 # CGIのセッションが自動的に行われる。 $guestbook->start; $guestbook->get_params; $guestbook->end; exit; 設置し終わったら、必ず自分が一番最初にアクセスして、管理者登録を行ってください !設置例 [CGI.pm]は必要に応じて配置してください。 *your_cgi_directory/(755) **GBS.pm(704) **[CGI.pm(704)] **jcode.pl(704) **your_guestbook.cgi(705) **dir_for_administrator_file/(701) ***password_file(606) **dir_for_log_file/(701) ***log_file(606) **dir_for_lock_file(703) !!セキュリティ !管理者 ::管理者モード: :::ゲストブックを設置し終わった後、最初にアクセスした人が、管理者登録をすることが出来ます。設置後は、必ず一番最初にゲストブックにアクセスしてください。 ::ログイン :::ゲストブック下部のフォームに管理者ログイン名とパスワードを入力して、掲示板を管理者モードで見ることができます。 :::管理者は、発言を削除することができます。 :::管理者モードでは、発言者の環境情報を見ることができます。GBS.pmは、'HTTP'、'REMOTE'ではじまる環境変数を取っています(ただし、HTTP_HOST、HTTP_CONNECTION、HTTP_ACCEPT系は取りません)。 ::管理者モードのリセット :::万が一、自分以外の人が管理者になってしまった場合は、パスワードファイルとログファイル両方の中身を空にすれば、管理者の再登録ができます。 ::管理者パスワード :::管理者パスワードは、crypt関数で暗号化されています。ソース(registerメソッド)を見ればわかりますが、はっきり言ってへなちょこです。管理者ディレクトリのパーミッションは必ず701にしておきましょう。 ::ワンタイムパスワード :::一度管理者認証が成功すると、以降は、ページに埋めこまれたワンタイム・パスワードによって認証が行われます。ワンタイム・パスワードの有効時間は10分間(check_otpwメソッド参照)。これらの認証手順はすべて、beginメソッド内で行っています。 !アクセス制限 アクセスを拒否したいドメインを列挙したテキスト・ファイルを設置し、そのパスをGBSオブジェクトに渡すことによってアクセス制限が可能。 ::プロパティ名:http_AccessRestrictionFilePath :::値:制限したいドメインを列挙したファイルのパス ::ブラックリスト・ファイルの書き方 :::一行一ドメイン。各行は"\n"で区切られます。 ::動作 :::訪問者のREMOTE_HOSTの中に、各行に記述された文字列が含まれていれば、キックアウトします(キックアウトされると、掲示板を閲覧することもできません)。 ::正規表現 ::://で記述を囲めば、正規表現を使用することも出来ます。 ::設置 :::ファイルは、GBS.pmの管理者用ディレクトリに置いておけば良いでしょう。 ブラックリスト・ファイルのパーミッションは、必要かつ安全なものにして下さい(704)。 ::ブラックリストの列挙例: hogehoge /hawaii[0-9]+\.pacific/ 一行目は、ドメイン名中に'hogehoge'が含まれているすべてのホストに対してアクセスを拒否しています。 二行目は、正規表現を使っています。相手がpacificドメイン、hawaiiアクセスポイントのどのホストを使っていても、拒否することができます。一方で、pacificドメイン、guamアクセスポイントのユーザーは締め出さずに済みます。 正規表現を使えば、REMOTE_HOSTにIPアドレスをセットするようなサーバーを拒否することができるでしょう。 なお、正規表現の記述中では、メタ文字はエスケープする必要がありますので、注意してください。 正規表現を使わない記述の場合は、メタ文字をエスケープしてはいけません。念のため。 ::コーディング例: #! /usr/local/bin/perl use GBS.pm; my $data = { 'cgi_Url' => 'ここにゲストブックのURLを記す', 'admin_FilePath' => 'ここに管理者パスワードファイルのパスを記す', 'log_FilePath' => 'ここにログファイルのパスを記す', 'lock_DirPath' => 'ここにロックファイル用ディレクトリのパスを記す', 'http_AccessRestrictionFilePath' => 'ブラックリスト・ファイルのパス', }; my $guestbook = GBS->new($data); $guestbook->start; $guestbook->get_params; $guestbook->end; exit; !アクセス許可 アクセス制限とまったく同じ要領で、指定したドメインだけにアクセスを許可することも出来ます。 ::プロパティ:http_AccessAllowFilePath :::値:アクセスを許可するドメインだけを列挙したファイルのパス ::動作 :::ファイルの記述の仕方、設置の仕方、オブジェクトへの渡し方は、アクセス制限の場合とまったく一緒です。ただ今度は、許可ファイルに記述されたドメインからの書きこみしかできなくなります。 ::正規表現 :::正規表現を使えば、REMOTE_HOSTを寄越さないサーバーを拒否することができるでしょう。 ::許可と拒否の併用 :::アクセス制限とアクセス許可を併用することも可能です。その際、ブラックリスト・ファイルの記述に該当するドメインは必ずキックアウトされます。許可ファイルで許可しなおすことはできません。 !連続書き込み防止機能 同じハンドル名で同じ内容を連続して書きこむことはできません(単に捨てられます)。 ::プロパティ:dup_CheckNum :::値:整数値で指定。デフォルトは5。5つ前の記事までさかのぼって、同一書き込みがないかチェックをする。 dup_CheckNumの値をもっと大きくしてGBSオブジェクトに渡せば、ロボットを使った間歇的な連続書き込みにも対処できるでしょう。 !最大書き込み文字数制限 ::プロパティ:http_MaxFormData :::値:整数値で指定。デフォルトは8192(単位はバイト)。 クライアントから送られて来たデータ量がどんなに大きくても、この値で足切りします。これは、すべてのフォームデータを含めた上限なので、ものすごく長いハンドル名を使っても、制限を破ることはできません。デフォルトの8192なら、日本語で1300〜1400字くらいまで受け付けます。 !HTMLタグ 使用できません。 !GETメソッド もちろんGETメソッドは受け付けません。 !!その他 開発プラットフォーム:FreeBSD 2.2.8 使用エディタ:mule