return

悪戯防止ライブラリ

zddbbs.pl


目次



悪戯防止ライブラリの利用環境


悪戯防止ライブラリの使用上の注意


悪戯防止ライブラリの使用方法

 なお、掲示板スクリプトは上記 minibbs.cgi を例に説明しますが、他のスクリプトを使用する場合は、適当に読み替えて下さい。
 また、以下では標準的な使用の場合について説明していますが、ご自身の環境に合わせて任意に変更可能です。

一般的な掲示板などでの設定例

 掲示板スクリプトに以下の変数が設定されているものとします。

 また、内部で exit する適当な &error 関数を設けておきます。

 掲示板スクリプトの最初の方で、zddbbs.pl を読み込みます。

require './zddbbs.pl';      # zddbbs.pl を読み込む
 メッセージの書き込みルーチンの最初の方で、書き込みを許可するかどうかの検査を行います。

$ret1 = &zddbbs'check_size( $query, 4096 );    # 日本語2000文字程度まで
$ret2 = &zddbbs'check_post( 1, 'http://www.foo.or.jp/~bar/' );	# URL は適当に変える
$ret3 = &zddbbs'check_user( 1,0,1,0 );
# 投稿者の情報を得るために、エラー処理を check_user の後まで遅らせます。
if ( $ret1 > 0 ) {          # check_size の検査にNGの場合のエラー処理
    &zddbbs'rec_logfile( 'zddbbs.log', 50 );   # ログファイルに記録する
    &error( '書き込み文字数が多すぎます' );
}
$ret4 = &zddbbs'check_frq( $message );
# ここでは、&zddbbs'check_str は使用していません。
$ret6 = &zddbbs'check_dup( 'zddbbs.dat',$message,1,$ENV{'REMOTE_ADDR'},60 );
&zddbbs'rec_logfile( 'zddbbs.log', 50 );       # ログファイルに記録する
# エラー処理を遅らせると、不正に関する情報がそれだけ多く得られます。
if ( $ret2 ) {
    &error( 'POST 以外や外部からの投稿は受け付けません' );
}
# 悪意の投稿者にはあまり多くの情報を提示しないようにします。
# ただし、善意の投稿者を誤って排除するおそれを考慮してエラーメッセージを考えてください。
if ( $ret3 || $ret4 ) {
    &error( '申し訳ありません。今回の書き込みを禁止させて頂きます。'.
        '誤って禁止してしまった場合は、管理者までご連絡ください。' );
}
if ( $ret6 == 1 ) { 
	&error( '重複したメッセージの書き込みを制限しています。' );
}
elsif ( $ret6 == 2 ) { 
	&error( '同一人の1分以内の連続書き込みを制限しています。' );
}

wwwboard.cgi での設定例

 wwwboard.cgi は、「とほほのWWW入門」のシンプルな掲示板です。
 このような軽快な掲示板に悪戯防止ライブラリを組み込むのもどうかと思いますが(実際ファイルサイズは zddbbs.pl の方が大きい)、設定例ということで…(^^;
 wwwboard.cgi などがあるディレクトリに、zddbbs.pl, zddbbs.dat, zddbbs.log を配置します。
 wwwboard.cgi の履歴一覧のすぐ後あたりに(1998.04.12 版の場合、22行目)、以下の行を挿入します。

# ▼▼悪戯防止ライブラリ▼▼
require './zddbbs.pl';
push( @taboo, 'とっても下品な言葉');
# ▲▲悪戯防止ライブラリ▲▲
 また、下の行(152行目)

if ($FORM{'MESSAGE'} ne "") {

の次の行に、下記の行を挿入します。

# ▼▼悪戯防止ライブラリ▼▼
$ret1 = &zddbbs'check_size( $query_string, 2000 );
$ret2 = &zddbbs'check_post( 1, 'http://www.foo.or.jp/~bar/' );	# URL は適当に変える
$ret3 = &zddbbs'check_user( 1,0,1,0 );
if ( $ret1 ) {
	&zddbbs'rec_logfile( 'zddbbs.log', 50 );
	&error( '<H3>書き込み禁止</H3><BR>申し訳ありません。<BR>'.
		'書き込み文字数が多すぎます。' );
}
$ret4 = &zddbbs'check_frq( $FORM{'MESSAGE'} );
$ret5 = &zddbbs'check_str( "$FORM{'MESSAGE'} $FORM{'FROM'} $FORM{'URL'}", *taboo );
$ret6 = &zddbbs'check_dup( 'zddbbs.dat',$FORM{'MESSAGE'},1,$ENV{'REMOTE_ADDR'},60 );
&zddbbs'rec_logfile( 'zddbbs.log', 50 );
if ( $ret2 || $ret3 || $ret4 || $ret5 || $ret6 > 0 ) {
	&error( '<H3>書き込み禁止</H3><BR>申し訳ありません。<BR>'.
		'今回の投稿は受け付けられません。' );
}
# ▲▲悪戯防止ライブラリ▲▲
 そして、スクリプトの最後に、以下の行を追加します。

# ▼▼悪戯防止ライブラリ▼▼
sub error {
	local( $msg ) = @_;
	print "Content-type: text/html\n\n";
	print "<HTML><HEAD><TITLE>Board room</TITLE></HEAD><BODY BGCOLOR=white>\n";
	print "$msg\n";
	print "</BODY></HTML>\n";
	rmdir("lock/wwwboard.loc");
	exit( 0 );
}
# ▲▲悪戯防止ライブラリ▲▲

minibbs.cgi ver.8.8 での設定例

 Web裏技 の掲示板 minibbs.cgi Ver.8.8 を例に説明します。
 たとえば minibbs.cgi の 144行目の

require './jcode.pl';

の次の行に、以下の行を挿入します。
 require の後の4行は例示で、禁止する必要がなければなくても結構です。
(なお、@forbiddenの設定は、全くのデタラメであり、実際のIPアドレスとは関係ありませんので、適当に変更してください)

# ▼▼悪戯防止ライブラリ▼▼
require './zddbbs.pl';      # zddbbs.pl を読み込む
push( @forbidden, '123.123.123.' ); # 書き込みを禁止するIPアドレスを登録する
push( @forbidden, '134.134.8[1-5].' );
push( @taboo, '禁止用語1' );   # 書き込みを禁止する言葉を登録する
push( @taboo, '禁止用語2' );
# ▲▲悪戯防止ライブラリ▲▲
 また、391行目の

sub regist {

の次の行に、以下の行を挿入します。

# ▼▼悪戯防止ライブラリ▼▼
$ret1 = &zddbbs'check_size( $buffer, 4096 );# 日本語2000文字程度まで
# $ret2 = &zddbbs'check_post( 1, $reload ); # $ref_axs = 1; が設定されているなら不要
$ret3 = &zddbbs'check_user( 1,0,1,0,*forbidden );
# 投稿者の情報を得るために、エラー処理を check_user の後まで遅らせます。
if ( $ret1 > 0 ) {          # check_size の検査にNGの場合のエラー処理
    &zddbbs'rec_logfile( 'zddbbs.log', 50 );   # ログファイルに記録する
    &error( '悪戯防止', '書き込み文字数が多すぎます' );
}
$ret4 = &zddbbs'check_frq( $FORM{'value'} );
$ret5 = &zddbbs'check_str( $FORM{'subject'} . $FORM{'value'}, *taboo );
$ret6 = &zddbbs'check_dup( 'zddbbs.dat',$FORM{'value'},1,$ENV{'REMOTE_ADDR'},60 );
&zddbbs'rec_logfile( 'zddbbs.log', 50 );		# ログファイルに記録する
if ( $ret3 || $ret4 || $ret5 ) {
    &error( '悪戯防止', '申し訳ありません。今回の書き込みを禁止させて頂きます。'.
        '誤って禁止してしまった場合は、管理者までご連絡ください。' );
}   # エラーコードは知らせない!($ret5 の禁止文字列は知らせてもよい)
if ( $ret6 == 1 ) { 
    &error( '悪戯防止', '重複したメッセージの書き込みを制限しています。' );
}
elsif ( $ret6 == 2 ) { 
    &error( '悪戯防止', '同一人の1分以内の連続書き込みを制限しています。' );
}
# ▲▲悪戯防止ライブラリ▲▲