Fortress BBS Ver.4.07 Secure Mod
対象プログラム Fortress BBS Ver.4.07
内容 JavaScriptを用いたアンチスパムの実装
説明 JavaScriptを使ってスパムに対する防御を強化します。

仕組みとしては,HTML側にダミーの送信パラメーターを書いておき,JavaScriptを使って実際のパラメーターを生成します。
JavaScriptは解読を避けるためにわざと複雑にしてありますが,中身はマッカーシー関数であり,必ず91を返します。
CGI側は91でなければ弾く設定にしておくことで,JavaScriptを正常に解読できるブラウザからの投稿のみが通ります。

JavaScriptはこちらからダウンロードして,ファイル名 secure.js で保存してください。
(secure.js のファイル名変更にはそのうち対応予定。)
日付 2008/6/6
バージョン 1.0
作者 Eternie
履歴 2008/6/6 初版作成

.\new\fbbs.cgi の 1行〜 13行付近

#!/usr/local/bin/perl



#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#

#_/                                                              _/#

$ver =  "FortressBBS Ver4.07 (AntiSpam Mod by Eternie)";#        _/#

#_/        作者:   メシス                                       _/#

#_/        メール: mewsyoui@hotmail.com                         _/#

#_/        開発元: http://mesis.s41.xrea.com/                   _/#

#_/                                                              _/#

#_/        強固たるセキュリティを誇る掲示板。・・・だと思う      _/#

#_/        使い心地を、なるべくYY-Boardに似せてあるものの、      _/#

#_/        やはりまったくの別物なので、ちと使いにくいかも。      _/#

#_/                                                              _/#


.\new\fbbs.cgi の 607行〜 622行付近

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=$wcode">

<META http-equiv="Content-Script-Type" content="text/javascript">

<META http-equiv="Content-Style-Type" content="text/css">

<STYLE TYPE="text/css">

<!--

$style

-->

</STYLE>

<script type="text/javascript" src="secure.js"></script>

END

}



sub footer {

print"<p align=\"right\" style=\"font-size:12px;\">管理者:<a href=\"mailto:$admail\">$adname</a> <a href=\"http://mesis.s41.xrea.com/\" target=\"_blank\">${ver}</a></p>\n";

}



sub sendcookie {


.\new\freg.cgi の 7行〜 22行付近

$Fm{'name'} = '名無し' if($Fm{'name'} eq '');

$Fm{'hp'} = '' if($Fm{'hp'} eq 'http://');

@returncount = split(/<br>/,$Fm{'comment'});

$fileexp = $1 if(($Fm{'file'} =~ /.*\.(.*)/) && ($upbbs == 1));

if($Fm{'title'} eq '') {

&error('タイトルがありません。');

} elsif($Fm{'comment'} eq '') {

&error('メッセージがありません。');

} elsif($Fm{'postauth'} ne '91') {

#投稿フォームに設置されたJavaScriptにより,JavaScriptを解釈できない機械による投稿でないことを確認。

#確認にはマッカーシー関数が使われているので,91でなければエラー

&error('不正な投稿です。正しい手段で投稿しているか確認してください。<br>JavaScriptを有効にすれば,このエラーは回避されます。');

} elsif(length($Fm{'name'}) > $maxnam) {

$tmplength = length($Fm{'name'});

&error("おなまえが長すぎます。<br>${maxnam}Bytes以内にしてください。<br>(現在:<b>${tmplength}</b>Bytes)");

} elsif(length($Fm{'mail'}) > $maxmai) {

$tmplength = length($Fm{'mail'});

&error("Eメールが長すぎます。<br>${maxmai}Bytes以内にしてください。<br>(現在:<b>${tmplength}</b>Bytes)");

} elsif(length($Fm{'hp'}) > $maxhpa) {

$tmplength = length($Fm{'hp'});


.\new\fmai.cgi の 240行〜 272行付近

        print<<END;

</body>

</html>

END

}



sub msgform {

        $sage = ($Fm{'mode'} eq 'res') ? '<tr><th colspan="2"><small>レス時に、スレッドを上げない</small> <input type="checkbox" name="sage" value="sage"> | レス後、この記事の返信画面に戻る <input type="checkbox" name="resback" value="resback"></th>' : '';

        print "<noscript><p>JavaScriptが利用できない環境では投稿できません。スパム対策のためJavaScriptを有効にして投稿してください。</p></noscript>\n";

        if($upbbs == 1) {

                print<<END;

<form action="$script" method="POST" ENCTYPE="multipart/form-data" style="display:inline;" name="postform">

END

        } else {

                print<<END;

<form action="$script" method="POST" style="display:inline;" name="postform">

END

        }

        print<<END;

<input type="hidden" name="id" value="$Fm{'id'}">

<input type="hidden" name="mode" value="comwrite">

<input type="hidden" name="rno" value="$Fm{'rno'}">

<input type="hidden" name="postauth" value="OK">

<table summary="表\" border="0" cellspacing="0" cellpadding="0">

<tr><th align="left"><small>おなまえ</small></th><td><input type="text" size="20" name="name" value="$name"></td></tr>

<tr><th align="left"><small>Eメール</small></th><td><input type="text" size="20" name="mail" value="$mail"></td></tr>

<tr><th align="left"><small>タイトル</small></th><td><input type="text" size="30" name="title" value="$rtitle"> <input type="submit" value="送信する" onClick="if(!confirm('書き込みますか?')) return false;" onKeyPress="" disabled="disabled" id="sendbtn" name="sendbtn"><input type="reset" value="リセット" onClick="if(!confirm('本当にリセットします。\\n内容が全て消えます。\\n・・・それでもよろしいですか?')) return false;" onKeyPress=""></td></tr>

<tr><th colspan="2" align="left"><small>メッセージ</small></th></tr>

<tr><td colspan="2"><textarea cols="70" rows="7" name="comment" wrap="off">$Fm{'comment'}</textarea></td></tr>

<tr><th align="left"><small>URL</small></th><td><input type="text" size="40" name="hp" value="$hp"></td></tr>

END

        if($iconon == 1) {

                print<<END;

<tr><th align="left"><small>イメージ</small></th><td><select name="icon">

END


.\new\fmai.cgi の 292行〜 307行付近

                if($color ne '') { $checked = ($color eq $colorcount) ? ' checked' : ''; } else { $checked = ($colorcount == 0) ? ' checked' : ''; }

                print"<input type=\"radio\" name=\"color\" value=\"$colorcount\"${checked}><font color=\"$tmpcolor\" size=\"-1\">■</font>&nbsp;\n";

                print"<br>\n" if($colorcount % 7 == 6);

                $colorcount++;

        }

        print<<END;

</td></tr>

</table>

<script type="text/javascript">

<!--

        SecureSet();

//-->

</script>

</td></tr>

END

        if($upbbs == 1) {

                print<<END;

<tr><th align="left"><small>添付ファイル</small></th><td><input type="file" size="20" name="file"> <small>(<a style="color:#0000FF;cursor:hand;" onClick="alert('${maxup}Bytesまで\\n\\n拡張子が\\n${upexplist}\\nのファイル');">アップロード可能\ファイル</a>)</small></td></tr>

END

        }

        print<<END;