MovableType 3.2-ja-2にアップする際、コメントスパムやトラックバックスパムへの対策が強化されたらしいということで、今度こそ導入しなくてもいいだろう、と思って組み込んでいなかった対策ですが(わざわざ毎回チェックしてコメントしてくれていた方も多いとは思いますが判定してませんでした)、コメントは表示はされないものの、やはり通知がうるさいので、導入し直すことにしました。
うーん。割と歴史あるな(笑)。
コメントスパム対策3.17
コメントスパム対策3.1
コメントスパム対策3.0
コメントスパム対策~その2 2.661
オリジナルのアイデア
C.G.I.: 簡単SPAMコメント対策
では説明。
このコメントスパム対策は、
「投稿の前にここをチェックしてください」
という方法でコメントスパムロボットの攻撃をかわすわけです。
ロボットでスパムをばらまいている人がわざわざ自分のコメント欄のフォームを解析してから送信することは、現状の直接 mt-comments.cgi を直接叩いていると思われる手法では十分な効果があると思いますが、フォームをきちんと解析するコメントスパムツールを使われたら、このような単純なチェック欄ではなく、足し算をさせるとか、人間でないとできないことを入れないとならないですね。
ホントは標準で、画像の文字列をランダムに生成して、そこに見える文字を入力してもらう、あのセキュリティがあってもいいのでは、と思います。ライブラリの関係で、できないホスティングサービスもあることでしょうが、MovableTypeの為だけに、Image::Magicをインストールしてあるホスティングサービスって割と多いと思うんですよね。
ま、その不満はさておき、まずは、
Individual Entry Archive
と
いうテンプレートにコメント入力欄を作っているので、そこに
<input type="checkbox" id="spamprotect" name="spamprotect" /><label for="spamprotect">投稿前にここをチェックしてください</label>
というのを投稿の「確認」のボタンの記述の直前に挿入します。
このタグ内で設定する name のパラメータを設置しているMovableTypeごとに個別の物にすることだけでも、このような簡単なスクリプトで、コメントスパムの自動化が防げるのではないか、と思うのですが…。
他にもコメント入力欄を用意している場合は、そこにも記述が必要です。
(私は他のテンプレートのコメント欄は潰してしまいました。面倒なので)
んで、
/MT/lib/MT/App/Comments.pm
に、このチェックボックスがチェックされているかを判定するコードを挿入します。
3.2-ja-2の場合、201行の後に入れるとよさそうです。
196: sub post {
197: my $app = shift;
198: my $q = $app->{query};
199:
200: return do_preview($app, $q, @_) if $app->request_method() ne 'POST';
201:
# Spam protection added by Kirishima original:chrome
if (!$q->param('spamprotect')) {
return $app->handle_error($app->translate("Spam Protection : Please check the 'Check here before post' checkbox."));
}
202: my $entry_id = $q->param('entry_id')
203: or return $app->error($app->translate("No entry_id"));
204: require MT::Entry;
赤字の部分を上で設定した name のパラメータにあわせます。
TypeKeyで認証されている人はチェックしなくてもいいように繊細な動作をしたいところですが、どこでどうやって判定するべきか追跡するのも面倒なので、相変わらず放置です。
(手抜き)
投稿フォームが静的な人は投稿フォームのある部分を再構築する必要があります。
すでに過去にこの方法をとっている場合は、プログラムの修正だけで動作します。
2006.5.18追記
最近はスパム対策のエントリだけをねらい打ちしてコメントスパムしてくれるようです。
とりあえず実験的に、チェックボックスの仕様を変更してみました。
が、
サイト全体の再構築が完了しません(苦笑)。