これまで,このブログに対するスパム対策としては Movable Type の設定をかえることで対処してきましたが,1 日に数 1000 のスパムをあびることもあり,ついにプログラムの変更をともなう対策にのりだしました. 第 1 歩としてはコメント投稿フォームのなかにかくされたフィールドをもうけて検査するという単純な方法をとってみました.
これまで,スパムの分析や対策を 「ブログへの最近のスパム数」,「このブログへのスパムの急増」,「スパムのさらなる増加と対策」,「つづく,ブログへのスパムとのたたかい」,「すぎさったブログへのコメント・スパムの嵐」 などの項目に書いてきました. これらでとった対策は Movable Type の設定を変更したり,スパム・フィルタのパターンを追加したりすることでした. 「すぎさったブログへのコメント・スパムの嵐」 という項目では,とりあえず嵐が去ったことを書きましたが,嵐はその後もたびたびやってきます. 最近では 1 日に数 1000 もフィルタできないスパムがおしよせることもあり,ついにプログラム変更をともなう対策にのりだしました.
Movable Type をつかったブログ・サイトのなかには,スパムをさけるために,4~8 桁くらいの数値を画像で表示させて,それを投稿者によみとらせる方法をとっているところもあります. しかし,この方法は投稿者の負担をふやすうえ,サーバの負荷も多少ですがあがります. まずはもっと単純な方法をためしてみようとおもいました.
そこでとった方法は,コメント投稿フォームのなかに 2 つのかくしフィールドをいれて,それらがふくむ値が一致するかどうかをみるという方法でした. つまり,「エントリー・アーカイブ」 のテンプレートをかきかえて,つぎのようなフィールドをいれます.
<input type="hidden" name="spam-protection-1" value="?" /> <input type="hidden" name="spam-protection-2" value="?" />
ここで ? のところには適当な数値や文字列をうめこみます. 従来との互換性をとるために既存のフィールドの使用もかんがえましたが,適当な方法がないのであきらめて,すべてを再構築することにしました.
つぎにプログラムをかきかえました. かきかえるべきプログラムは Movable Type の lib/MT/App/Comments.pm のなかのつぎの部分です. 赤字のところが追加した部分です.
my $text = $q->param('text') || ''; $text =~ s/^\s+|\s+$//g; if ($text eq '') { return $app->handle_error($app->translate("Comment text is required.")); } # Spam protection (by YK 080608) my $spam_protection_1 = $q->param('spam-protection-1'); if ($spam_protection_1 eq '' || $spam_protection_1 ne $q->param('spam-protection-2')) { return $app->handle_error($app->translate("Invalid comment form.")); } my ($comment, $commenter) = _make_comment($app, $entry); my $remember = $q->param('bakecookie') || 0; $remember = 0 if $remember eq 'Forget Info'; # another value for '0'
しばらくはこれで様子をみて,必要ならまた対策をとりたいとおもっています.