トラックバック/コメントSPAMの対策をしたよ

 受験なのにコメント欄のSPAMを手動で削除するとか出来るわけないだろ常識的に考えて…

 ということで、(マシンパワー的に)安上がりだけど効果のある方法を考えてやってみました。

 今のところ来てません。どれくらいもつかな…。コメント/トラックバックの公開前の手動確認などは行っておらず、直ちに公開されるので、SPAMコメント/トラックバックが来てたら…そういう事だと思ってください^^;

スクリプト名変更

 出来れば呼び出されたくすらないので†1、スクリプトファイルの名前を書き換えてしまいます。

  • mt-comments.cgi → mt-comment.cgi
  • mt-tb.cgi → mt-trackbacks.cgi

 に書き換えた場合、mt-config.cgiの以下の部分を書き換えてください。

# AdminScript mt.pl
#ここの部分のコメントを外し、書き換えた後のスクリプト名に変更する。
CommentScript mt-comment.cgi
TrackbackScript mt-trackbacks.cgi
# SearchScript mt-search.pl
# XMLRPCScript mt-xmlrpc.pl
# ViewScript mt-view.pl
# AtomScript mt-atom.pl
# UpgradeScript mt-upgrade.pl

 これで完了です。

コメント対策

 「さきゅばす」公式サイトの掲示板でも行っている、「今年何年?」認証です。日本語が読めないと駄目なのが痛いところですが、ほとんどSPAM以外に外国語コメントは来たことがないのでまあこれで良いでしょう。

 「個別エントリ」、「コメントの一覧」、「コメントプレビュー」のテンプレートのメール欄の下に、西暦の入力欄を作成します。

<p>
<label for="comment-code">今年は西暦何年?(SPAM対策です): </label>
<input id="comment-code" name="code" size="30" />年
</p>

 次に、認証のためのコードを少し追加します。lib/MT/App/Comment.pmを以下を参考にして追加してください。

sub post {
my $app = shift;
my $q = $app->{query};
return $app->error($app->translate("Invalid request"))
if $app->request_method() ne 'POST';
#追加開始
my $code = $q->param('code') || '';
$code =~ s/^\s+|\s+$//g;
if ($code eq '') {
return $app->handle_error("今年は西暦何年か答えてください。");
}
my @code_localtime = localtime(time);
my $code_true_code = 1900 + @code_localtime[5];
if ($code ne $code_true_code) {
return $app->handle_error("今年は西暦$code年じゃないですよ。");
}
#追加おわり

 保存する際、自分のBlogの文字コードと同じ文字コードで保存してください。ちなみにこのサイトの場合はUTF-8です。

 どこかのページを再構築して実際にためしてみてくださいね。

トラックバック対策

 トラックバックも同じように「今年何年?」で認証するのは無理なので、メールと同じ感じでいいかなーと。。。

 そのため、必ずスクリプト名は変更してください。

 まずはページの上の方にコメントとしてついているRDFのトラックバック欄を書き換えます。

 lib/MT/Template/ContextHandlers.pmを以下を参考にして書き換えてください。

sub _hdlr_entry_tb_data {
my($ctx, $args) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryTrackbackData');
require MT::Trackback;
my $tb = MT::Trackback->load({ entry_id => $e->id })
or return '';
return '' if $tb->is_disabled;
my $cfg = MT::ConfigMgr->instance;
my $path = _hdlr_cgi_path($ctx);
#ここを書き換え
$path .= $cfg->TrackbackScript . '<DELETE THIS>/' . $tb->id;

 テンプレートの「エントリ・アーカイブ」のトラックバックURLのところを

<p>このエントリーのトラックバックURL: <br />
<$MTCGIPath$><DELETE THIS><$MTTrackbackScript$>/<$MTEntryID$></p>

 みたいな感じに書き換えてください。

 自動処理で数多くのBlogを同時に狙ってくるようなタイプのSPAMerには効果があるはずです。個別で狙われたら意味がほとんどありませんが、狙われたら狙われたで人気がある証拠ですので、喜んでください(えー

  • †1: コメント/トラックバックのCGIは重いから