アッ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のキャッシュに残ってしまっているため、そこから読めてしまうことがあります。
それを防ぐには、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@/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
#}
# ここまで
特定ユーザのみの非公開掲示板や、パスワード保護されたページ内に置く掲示板として使う場合は、是非以下の対策をしてください(逆に、秘密の掲示板でない限りこの対策は必要ありません)。掲示板の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には、以下の方法で組み込んでください。
# 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);
}