| 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 初版作成 |
#!/usr/local/bin/perl
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/#
#_/ _/#
$ver = "FortressBBS Ver4.07 (AntiSpam Mod by Eternie)";# _/#
#_/ 作者: メシス _/#
#_/ メール: mewsyoui@hotmail.com _/#
#_/ 開発元: http://mesis.s41.xrea.com/ _/#
#_/ _/#
#_/ 強固たるセキュリティを誇る掲示板。・・・だと思う _/#
#_/ 使い心地を、なるべくYY-Boardに似せてあるものの、 _/#
#_/ やはりまったくの別物なので、ちと使いにくいかも。 _/#
#_/ _/#
<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 {
$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'});
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
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> \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;