これまで,このブログに対するスパム対策としては Movable Type の設定をかえることで対処してきましたが,1 日に数 1000 のスパムをあびることもあり,ついにプログラムの変更をともなう対策にのりだしました. 第 1 歩としてはコメント投稿フォームのなかにかくされたフィールドをもうけて検査するという単純な方法をとってみました.
これまで,スパムの分析や対策を 「ブログへの最近のスパム数」,「このブログへのスパムの急増」,「スパムのさらなる増加と対策」,「つづく,ブログへのスパムとのたたかい」,「すぎさったブログへのコメント・スパムの嵐」 などの項目に書いてきました. これらでとった対策は Movable Type の設定を変更したり,スパム・フィルタのパターンを追加したりすることでした. 「すぎさったブログへのコメント・スパムの嵐」 という項目では,とりあえず嵐が去ったことを書きましたが,嵐はその後もたびたびやってきます. 最近では 1 日に数 1000 もフィルタできないスパムがおしよせることもあり,ついにプログラム変更をともなう対策にのりだしました.
Movable Type をつかったブログ・サイトのなかには,スパムをさけるために,4~8 桁くらいの数値を画像で表示させて,それを投稿者によみとらせる方法をとっているところもあります. しかし,この方法は投稿者の負担をふやすうえ,サーバの負荷も多少ですがあがります. まずはもっと単純な方法をためしてみようとおもいました.
そこでとった方法は,コメント投稿フォームのなかに 2 つのかくしフィールドをいれて,それらがふくむ値が一致するかどうかをみるという方法でした. つまり,「エントリー・アーカイブ」 のテンプレートをかきかえて,つぎのようなフィールドをいれます.
<input id="comment-bake-cookie" type="hidden" value="?" /> <input id="??" type="hidden" value="?" />
ここで ?, ?? のところには適当な数値や文字列をうめこみます. comment-bake-cookie というフィールドはもともとあったものですが,不要なので流用しました. 既存のフィールドを使用したのは互換性をとるためでもあります. 私のばあい,すでに多数の “ブログ” をつくっているので,いきなり互換性のない方法はとれないとかんがえたからです.
互換性があるということのひとつの意味は,このかきかえをおこなっても従来のプログラムがそのまま動作するということです. したがって,まずはこの状態でコメント投稿のテストをして,うまくいったところで,つぎにプログラムをかきかえます. かきかえるべきプログラムは 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 my $spam_cookie = $q->param('comment-bake-cookie'); if ($spam_cookie ne '1' && $spam_cookie ne $q->param('??')) { return $app->handle_error($app->translate("Invalid 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'
従来との互換性を重視したため,この方法ではスパムの内容によってはフィルタすることができません. それにしてもどうも期待したとおりにはうごかないようなので,なにか,みおとしているのかもしれません. しかし,すくなくとも,いまのところ,うけつけられるスパムはかなりへっています. しばらくはこれで様子をみて,必要ならまた対策をとりたいとおもっています.