アッhan! BBS 改造計画


 アッhan! BBSは、ぶんぶん氏によるスレッド浮上式掲示板スクリプトです。http://www.kokobbs.com/ahhan/でダウンロードできます。

 下記プログラムの、
# n行:変更に関する説明 by Kan-chan
の、「n行」(nには数字が入る)の部分が、変更箇所の行です。本ページではバージョン2.55eの場合の行数を書いています。他のバージョンでは行数が少し違いますので注意してください。


ログが壊れるバグを修正する

 この修正は必ず行ってください。一部の携帯電話からアクセスするとログが壊れるバグがあるので、その対策です。mibbs.cgiの314行目にコードを追加します。具体的には、

			$FORM{$name} =~ s/\W//g;
		}
	}

の部分を、

			$FORM{$name} =~ s/\W//g;
		}
# 314行:ログが壊れるバグ修正  by Kan-chan
		if($name ne 'com'){ $FORM{$name} =~ s/[\r\n]//g; }
# ここまで
	}

にします。


googleにページ内容をキャッシュされないようにする

 せっかく掲示板から投稿を削除しても、googleのキャッシュに残ってしまっているため、そこから読めてしまうことがあります。

 それを防ぐには、design.plの202行にタグを追加します。具体的には、

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
$_[8]

の部分を、

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta name="robots" content="noarchive">
<meta name="googlebot" content="nosnippet">
$_[8]

にします。


ページの上に検索欄と注意書きを追加する

 うちのサイトの掲示板みたいに、注意書きを付ける改造をしたいという声を聞いたので、公開します。まず、design.plの225行にタグを追加します。具体的には、

sub Top_ground_c {
my $top_ground=(<<"EOF");
<table border="$_[3]" cellspacing="2" cellpadding="2" width="$_[0]%"  bordercolor=$_[1] align="center">
<tr><td bgcolor=$_[2]><font size="2">
EOF
	return $top_ground;
}

の部分を、

sub Top_ground_c {
my $top_ground=(<<"EOF");
<table border="$_[3]" cellspacing="2" cellpadding="2" width="$_[0]%"  bordercolor=$_[1] align="center">
<tr><td bgcolor=$_[2]>
<b><font size="+1">キーワード検索</font></b>
<form action="/cgi/board/search.cgi" method="POST" target="_blank">
<input type=hidden name=fo value="$_[4]">
<input type=hidden name=mode value="search">
<b>さがす言葉:</b><input type="text" size="40" name="word">
<input type=radio name=cond value="and" checked>AND検索(普通はこちら)
<input type=radio name=cond value="or">OR検索
<input type=submit value="検索開始">
</form>
掲示板内の投稿から、指定した言葉(キーワード)の使われた投稿を検索できます。<br>
「紅茶 コーヒー」のように、空白(スペース)で区切って二つ以上の言葉を探すこともできます。<br>
AND検索……上の例では、「紅茶」と「コーヒー」の両方の言葉が書かれた投稿を探します。「紅茶」だけ、「コーヒー」だけの投稿は探しません。<br>
OR検索……上の例では、「紅茶」か「コーヒー」のどちらかの言葉が書かれた投稿を探します。
</td></tr>
</table>
<table border="$_[3]" cellspacing="2" cellpadding="2" width="$_[0]%"  bordercolor=$_[1] align="center">
	<tr><td bgcolor=$_[2]><font size="2">$rules_of_the_board</font></td></tr>
</table>
<table border="$_[3]" cellspacing="2" cellpadding="2" width="$_[0]%"  bordercolor=$_[1] align="center">
<tr><td bgcolor=$_[2]><font size="2">
EOF
	return $top_ground;
}

にします。

 次に、design.plの78行に以下のコードを追加します。文面は必要に応じて書き換えてください。

	#◆A13◆ 注意事項
	$rules_of_the_board = (<<EOM);
本掲示版の標語です。<br>
・<b><big>「繰り返すな 既出の質問」</big></b> 上の「キーワード検索」を活用しましょう(PC用サイトだけの機能\)。<br>
・<b><big>「読む前に書くな 書く前に読め」</big></b> 「全レスを表\示」をクリックすると最初から読めます。<br>
・<b><big>「自分が探される前に みんなを探せ」</big></b> まず既存のスレッドを探し、あれば輪に加わるのが、返事をたくさんもらうコツ。<br>
EOM

 最後に、mibbs.cgiの701行を変更します。

		$top_ground_c = &mbbslib'Top_ground_c(
				$parce,$bd_col,$tbgc_a,$border_width
				);

の部分を、

		$top_ground_c = &mbbslib'Top_ground_c(
# 701行:検索欄を追加  by Kan-chan
#				$parce,$bd_col,$tbgc_a,$border_width
				$parce,$bd_col,$tbgc_a,$border_width,$folder
# ここまで
				);

にします。


「名無しさん」というハンドルでの投稿そのものを禁止する

 最新バージョンでは、名前を空欄にした投稿の禁止を設定可能ですが、それでも「名無しさん」という名前を名前欄に入れると投稿できてしまいます。これも禁止するには以下のコードを追加します。

# 474行:「名無しさん」のハンドル禁止機能追加  by Kan-chan
		if (($name =~ /(名無し|名なし|七資産|通りすがり|通りがかり|匿名|nobody|anonymous)/) && ($pwd ne $master_pass)){ &error("名前を記入してください。","$lock_a",'',''); }
# ここまで

投稿者のリモートホストをソースに埋め込む

 パッチを当てる箇所は二箇所あります。まず以下のコードを追加し、

# 1252行:リモートホスト埋め込み機能追加(1/2)  by Kan-chan
	$no_org = $no;
# ここまで

 次に、

$threadres_a=(<<"EOF");
<dt>$no: 名前:$name<font size="2">投稿日:$date$home_a</font><dd>$msg $space3
EOF
}

となっている部分を以下のように変更します。

# 1280行:リモートホスト埋め込み機能追加(2/2)  by Kan-chan
$dat_c = &mbbslib'File_Name ($log_dr,$folder,$thre_no,"c",$extension);
if (open(LOG,$dat_c)){
	@c1st = <LOG>;
	close(LOG);
}
if(@c1st){
	foreach $datac (@c1st) {
		chop($datac);
		($mark_no,$r_host,$c_date) = split(/<>/,$datac);
		if($no_org eq $mark_no){
			$host_a = $r_host
		}
	}
}
$name =~ s/([0-9A-Za-z\.\-])\@/$1&#64;/g;
$threadres_a=(<<"EOF");
<dt>$no: 名前:$name<!-- $host_a --><font size="2">投稿日:$date$home_a</font><dd>$msg $space3
EOF
}

#$threadres_a=(<<"EOF");
#<dt>$no: 名前:$name<font size="2">投稿日:$date$home_a</font><dd>$msg $space3
#EOF
#}
# ここまで

HTTP_REFERERの漏れを防止する

 特定ユーザのみの非公開掲示板や、パスワード保護されたページ内に置く掲示板として使う場合は、是非以下の対策をしてください(逆に、秘密の掲示板でない限りこの対策は必要ありません)。掲示板のURLや、会員パスワードの漏洩を防ぎます。

 URL:欄や本文に書かれたURLをクリックすると、そのページへジャンプしますが、そのジャンプ先のページにアクセス解析プログラムが組み込まれている場合、リンク元のURLがわかってしまいます。

 URLがリンク先ページの管理者にバレるならまだしも、掲示板がパスワード保護されたページ内に置かれている場合は、会員のIDやパスワードがバレる可能性もあります。
 IDやパスワードの入力を省略するために、http://id:pass@www.oooo.ne.jp/~gombei/.....のように、URLにIDとパスワードを含めてその掲示板にアクセスしている場合、(最近のブラウザでは既に対策済ですが)かなり古いブラウザでは、リンク先にアクセス解析プログラムがあると、URLと一緒にIDやパスワードも伝えてしまうことがあります。

 そこで、拙作Referer Sweeperを使って、リファラ(リンク元のURL)が漏れるのを防止します。こう説明すると何だか難しいことのように思えますが、早い話が2ちゃんねるのリンク中継ページ(つまり、掲示板に張られたリンクをクリックすると、直接飛ばずに中継ページが表示され、そこのリンクをクリックしてようやく表示できる)、あれと同じ原理です。アッhan! BBSには、以下の方法で組み込んでください。

  1. まず、Referer Sweeperを、URLがバレてもいい場所にあらかじめインストールしておきます。具体的には、秘密の掲示板と同じディレクトリを避けて別のディレクトリにインストールするか、別のサーバにインストールします。これからの説明では、http://kan-chan.stbbs.net/cgi/refsweep.cgiというURLにインストールされているものとします。
  2. 次に、proofing.plのAutoLinkサブルーチンを以下のものに入れ替えます。
# 310行:リファラ消去機能対応  by Kan-chan
sub AutoLink {
$refsweep = "http://kan-chan.stbbs.net/cgi/refsweep.cgi?";
	if( $_[1] ){
		if( $_[2] ){
	$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=$refsweep$2 target=\"_blank\">$2<\/a> \[<a href=\"view\-source:$2\">source<\/a>\] \[<a href=\"http\:\/\/cgi\.coara\.or\.jp\/cgi\-bin\/cgiwrap\/tkuri\/BCC\/bcc\.cgi\?$2\"target=\"_blank\">check<\/a>\]/g;
	$_[0] =~ s/([^=^\"]|^)(ftp\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=$2 target=\"_blank\">$2<\/a> \[<a href=\"view\-source:$2\">source<\/a>\] \[<a href=\"http\:\/\/cgi\.coara\.or\.jp\/cgi\-bin\/cgiwrap\/tkuri\/BCC\/bcc\.cgi\?$2\"target=\"_blank\">check<\/a>\]/g;
		}else{
	$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=$refsweep$2 target=\"_blank\">$2<\/a>/g;
	$_[0] =~ s/([^=^\"]|^)(ftp\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=$2 target=\"_blank\">$2<\/a>/g;
		}
	}
	return $_[0];
}
# ここまで

 なお、後にReferer Sweeper機能がいらなくなったら、$refsweep = "";に変更すれば無効にできます。


長文省略時の文字化けを直す

 現バージョンでは修正されました。バージョン2.53a以前など古いバージョンをまだ使っている場合は、バージョンアップすれば修正できます。
 古いバージョン用に作った、漢字コードの途中かどうか判定して、正しく文字列を切り出すルーチンを、参考までにこのページに残しておきます。他のプログラムにも応用してみてください。

# &mbbslib'Is_SjisKanji(string, pos)
# 文字列stringのpos番目(0から数える)の一バイトがSJIS全角文字かどうか判定
# 戻り値:'A'...ASCII、'S1'...全角第一バイト、'S2'...全角第二バイト、''...文字なし
#
# アルゴリズム:0x80-0x9F、0xE0-0xFFの一バイトをT、その他の一バイトをAとすると、
# 文字列の最後が
#    *AA...A
#   *ATA...S2
#  *ATTA...A
# *ATTTA...S2
#
#    *AT...S1
#   *ATT...S2
#  *ATTT...S1
# *ATTTT...S2
# である。
sub Is_SjisKanji {
	my ($string, $pos);
	my ($i, $c, $a, $s2);

	$string = $_[0];
	$pos = $_[1];

	if ((length($string) - 1) < $pos){ return ''; }

	$c = ord(substr($string, $pos, 1));
	if (($c <= 0x7F) || ((0xA0 <= $c) && ($c <= 0xDF))){
		$a = 1;
	} else{
		$a = 0;
	}

	$s2 = 0;		# 初期値は0(第二バイトではない)
	for ($i=$pos-1;$i>=0;$i--){
		$c = ord(substr($string, $i, 1));
		if (($c <= 0x7F) || ((0xA0 <= $c) && ($c <= 0xDF))){ last; }
		$s2 ^= 1;		# 0と1を反転(XORを使用)
	}

	if ($s2 == 1){
		return 'S2';
	} else{
		if ($a == 1){
			return 'A';
		} else{
			return 'S1';
		}
	}
}

# &mbbslib'Sjis_Substr(string, start, num, hangdown_first, hangdown_last)
# 文字列stringのstart番目(0から数える)からnum文字分切り出した結果を返す
# hangdown_firstが
#  true……最初の文字がSJIS全角文字の第二バイト目ならその文字を含めて返す
#  false……最初の文字がSJIS全角文字の第二バイト目ならその文字を切り捨てて返す
# hangdown_lastが
#  true……最後の文字がSJIS全角文字の第一バイト目ならその文字を含めて返す
#  false……最後の文字がSJIS全角文字の第一バイト目ならその文字を切り捨てて返す
sub Sjis_Substr {
	my ($string, $start, $num, $hangdown_first, $hangdown_last);
	my ($s, $n, $result1, $result2);

	$string = $_[0];
	$start = $s = $_[1];
	$num = $n = $_[2];
	$hangdown_first = $_[3];
	$hangdown_last = $_[4];

# 最初の文字のSJIS全角第二バイト判定
	$result1 = Is_SjisKanji($string, $start);
	if ($result1 eq 'S2'){
		if ($hangdown_first eq true){
			$s--;
			$n++;
		} else{
			$s++;
			$n--;
		}
	}

# 最後の文字のSJIS全角第一バイト判定
	$result2 = Is_SjisKanji($string, $start+$num-1);
	if ($result2 eq 'S1'){
		if ($hangdown_last eq true){ $n++; } else{ $n--; }
	}

	return substr($string, $s, $n);
}

戻る