[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 対策