数日前にコメントスパム対策としてmt-comment.cgiの名前を変更したんですが、全く効果がなかったので、別の対策を行うことにしました。
他のブログはどんな対策をしているかみてみると、
-TypeKeyを使う
-連続投稿できる間隔を設定
-日本語が含まれていないコメントをブロック
-BanリストによるIP制限
というような方法が一般的みたいです。それぞれの方法をみてみると、TypeKeyは普通にコメント書きたい人にも一手間かけてしまうのがちょっとと思うし、連続投稿できる間隔の設定というのも一回は書き込まれてしまうし、Banリストは作成するのがめんどいしということでいまいち。
そこで今回は日本語が含まれていないコメントをブロックするという方法を少し発展させて全角ひらがなが連続するm文字が、n箇所以上無いコメントはスパムとみなすという対策をとることにしました。
今回修正したファイルはMT::App::CommentsとMT::L10N::jaの2つです。モジュールを直接いじるとMTをバージョンアップするときなんかに困ることになりそうなんで、プラグインとして書こう思ったんですが、プラグインの作り方を調べるのがめんどくさくなって、直接修正に妥協しちゃいました。。
この修正で、ひらがなが3文字連続している部分が2箇所以上ないコメントをPostした場合、エラーメッセージを表示するようになりました。軽くテストしましたがきちんと動いているみたい。
以下のコードをMT::App::Commentsのpostメソッドの上の方に追加し、MT::L10N::jaの%Lexiconに日本語エラーメッセージを追加しました。
>
my ( $m, $n ) = ( 3, 2 ); # ひらがなの文字数, 出現する回数
my $enc = $app->{cfg}->PublishCharset || '';
my $text = MT::I18N::encode_text($q->param('text'), $enc, 'euc');
my @count = $text =~ /(?:\xA4[\xA1-\xF3]){$m,}/g;
return $app->handle_error($app->translate(
"Your comment looks like a spam.[_1][_2]", $m, $n ))
if $text ne "" && scalar (@count) < $n;
<