[2008-12-04-1] のその後。
kuttukibbs.cgi をいじって、なんちゃってスパム対策をしました。
スパムと判定したら、書き込みを無視するようにしました。
追記(2009-03-28):
オリジナル(kuttukibbs-1.0rc3.tar.gz)の kuttukibbs.conf と
kuttukibbs.cgi へのパッチを貼り付けておきます。
--- kuttukibbs.conf.org 2004-04-08 22:27:02.000000000 +0900
+++ kuttukibbs.conf 2009-03-28 22:41:32.000000000 +0900
@@ -33,6 +33,10 @@
$charset = "EUC-JP";
# --------------------------------------------------------------------
+# メッセージの中にこの数字より多く "http:" が含まれていたらスパム
+$spam_threshold = 3;
+
+# --------------------------------------------------------------------
# デフォルトページ (全コメント見る・コメント投稿) のテンプレート
$page_template_default = << 'PAGE'
<html>
--- kuttukibbs.cgi.org 2004-12-15 23:09:58.000000000 +0900
+++ kuttukibbs.cgi 2009-04-28 23:51:14.000000000 +0900
@@ -17,6 +17,7 @@
my $page_template_latest;
my $page_template_edit;
my $charset = "EUC-JP"; # 文字コード
+my $spam_threshold = 3; # メッセージの中にこの数字より多く "http:" が含まれていたらスパム
### グローバル変数
my $latest_id = -1; # 最新のコメントの ID
@@ -48,6 +49,9 @@
my $mail_or_url = $q->param('mail');
my $body = $q->param('body');
+# スパム判定
+my $spam = &guess_spam;
+
# header
if ($mode eq 'write') {
escape_string(\$name);
@@ -132,9 +136,14 @@
$com_hash{$latest_id}{m} = $body;
$com_hash{$latest_id}{d} = $what_time_is_it_now;
- write_to_logfile(); # ログファイルへの書き込み
- write_to_jsfile($fn_pref.".js"); # JavaScript Feed ファイルへの書き込み
+ if ($spam == 0) {
+ write_to_logfile(); # ログファイルへの書き込み
+ write_to_jsfile($fn_pref.".js"); # JavaScript Feed ファイルへの書き込み
+ }
write_to_adminlogfile(); # 管理者用ログファイルへの書き込み
+ # if ($spam == 1) {
+ # die('error');
+ # }
}
}
@@ -288,6 +297,13 @@
### 管理者用ログファイルへの書き込み
sub write_to_adminlogfile {
+ my $str_judge;
+ if ($spam == 1) {
+ $str_judge = "spam";
+ }
+ else {
+ $str_judge = "ham";
+ }
my $str = "remote_host: ". $q->remote_host(). "\n";
$str .= "id: $logid\n";
$str .= "mail or url: $mail_or_url\n";
@@ -295,6 +311,9 @@
n[$latest_id] = "$name";
m[$latest_id] = "$body";
d[$latest_id] = "$what_time_is_it_now";
+r[$latest_id] = "$ENV{'HTTP_REFERER'}";
+u[$latest_id] = "$ENV{'HTTP_USER_AGENT'}";
+s[$latest_id] = "$str_judge";
ADD
;
@@ -335,3 +354,20 @@
print $page_html;
exit;
}
+
+### スパム判定する。
+sub guess_spam {
+ my $body_tmp = $body;
+ my $count = $body_tmp =~ s/http://g;
+
+ if ($count > $spam_threshold) {
+ return 1;
+ }
+
+ # 日本語が含まれていない。
+ unless ($body_tmp =~ /[\xA1-\xFE][\xA1-\xFE]/) {
+ return 1;
+ }
+
+ return 0;
+}
追記(2009-04-29):
コメント中の “http:” をすべて消すというバグがあったので、
kuttukibbs.cgi へのパッチを差し替えました。o
my $count = $body =~ s/http://g;
ってやると、$body 自体も書き換えちゃうのね。
まあ、単に “http:” の数を求めたいだけなんだけど。。
追記(2009-08-22):
直接参考にしてないけど、こんなページもあったのでメモしておきます。
くっつきBBS “kuttukibbs.cgi” の spam 対策