アッ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); }