« yaplog ライクなコメントリストをつけてみよう | メイン | 劇的!ビフォーアフター!? デスクトップ編 »

コメントスパムなんて大嫌い for MovableType 3.1

2004.12.29記: このエントリーで紹介している方法は、それなりに有効な手段ではありますが、後述しますように決して完璧なものではなく、当ブログでもこれを突破するコメントスパマーが現われました。どうか「お手軽なコメントスパムブロック法」くらいに認識の上、できれば他の方法との併用をおすすめします。 当ブログではその後、この方法に加えて MT-Blacklist を採用しました。詳細は2004年12月27日のエントリー「MT-Blacklistを導入してみた。」をご覧ください。

また、現在コメントフォームでcookieを使わないと、プレビュー上のフォームに名前・メールアドレス・URLが反映されないという不具合があり、現在も原因調査を続行中です。この対策をお使いの場合はできるだけcookie使用推奨でお願いします。

28-May-2006 更に追記:
上記の「名前」「メールアドレス」「URL」の値がプレビューに引き継がれないバグについては、「シリコンバレー 24時」が『MovableType のスパム対策(11) 「コメントスパム対策(10)」』で解決してくださっていますので、今後コメントフォーム用のソースについては「シリコンバレー 24時」のものをお使いになることを推奨します。
どのようにバグをとってくださったかの過程に興味のある方は、同ブログの「MTスパム」カテゴリを丸ごとお読みになることをおすすめします。「シリコンバレー24時」の四元さん、ほんとうにありがとうございます。

※3.1と書いておりますが、おそらく3.01でも大丈夫だと思います……
 ただし、実際の改造および動作確認は3.11-jaで行いましたので念のため。

これまでぜんぜんコメントスパムが来なかったからと、なんにも対策していませんでしたが、コメントスパムに手を焼いている現場を目のあたりにしていてはほうっておけません。

コメントスパム対策には何種類かの方法があります。サーチエンジンで調べたところよくひっかかったのは


  • 日本語が含まれているコメントのみを有効にする。現在のところ、コメントスパマーは欧米言語(それもほとんど英語)圏の人が多いのである程度有効なのかもしれないが、この方法は日本語の扱えるコメントスパマーが現れたら使えない。

  • コメントを管理人のOKが出たものだけ公開するよう設定する。ブログを見に来る人に不快感や心配を与えないという点では悪くないのですが、コメントスパムを消す手間は結局同じ。せっかちな訪問者だと、コメントを管理人がなかなか認証してくれない時、ちょっとむかついちゃうかも。よって多忙な管理人には向いてません。

  • コメントにTypeKey認証を必要とするよう設定を変更する。コメントスパムそのものを弾くには絶大な効果あり。ただ、MTユーザなどTypeKeyへの登録が必要な人ならともかく、そうでない人にも TypeKey への登録の手間をかけさせることになるため、コメント自体「めんどくさーい」と退かれてしまう可能性が大きい。

  • mt-comment.cgi の 名前を変更する。ちょっとした設定変更だけででき、ユーザが何も考えずいつもと同じようにコメントできるメリットがある。フォームを解析されて新しいコメントCGIの名前を拾われたら効果はなくなってしまうが、これだけで効果が出ているブログも少なくありませんことよ。

  • コメントフォームにダミーの変数を追加して、その変数と一緒にコメント用CGIを呼び出さないとコメントできない設定にする。ダミーの変数が解析されたらおしまいではあるんですが、これひとつでコメントスパムが回避できた事例も多いみたいですぜ。

こんな感じですかね。
効果と利便性から考えた結果、最後の2つがいい感じだと考えたので。
まずは一番最後の「ダミー変数作戦」を実行に移すことにしました。

参考にさせていただいたのはMovableTypeコメントスパム対策@女子十二月号

「女子十二月号」では変数を2つにして対処してらっしゃいますが、わたしは1つですませています。

さて、「女子十二月号」がお使いのMovableTypeは2.661。

ここで大きな問題が立ちはだかっております。わたしのMTちゃんは3.1。
素直に「女子十二月号」さんのやり方を真似はできないのです。

というのも、「女子十二月号」によれば

Individual Entry ArchiveComment Listing TemplateComment Preview TemplateComment Error Template

とあります。
MovableType3.1(日本語版)ではこれは

  • 個別エントリーアーカイブ

  • コメント・リストのテンプレート

  • コメント・プレビューのテンプレート

  • コメント・エラーのテンプレート


のことをそれぞれ意味するんですが、問題なのは「個別エントリーアーカイブ」を除くあとの3つ。
というのも、この3つのテンプレートについては、コメントフォームの部分がそれぞれ <MTCommentFields> あるいは <MTCommentFields preview="1" static="1"> という一言ですまされてしまっているのです。
そして調べたのですが、デフォルトの <MTCommentFields> を我々普通の人(だよね?)がいじる方法はわかりません。

ではどうするか。
<MTCommentFields> を自分で作ってしまうのです。
正確には、それに代わるオリジナルのコメントフォームを作って、それに例のダミー変数を入れちゃえばいいんです。理屈はそんなに難しくありませんが、ぶっちゃけ、超めんどくさい……
と思ったら同じことを考えていた方はいらっしゃったようで。

MovableType 3.01D-ja 導入@yujilog

ここで「MTCommentFields」に代わるコメントフォームが紹介されています。

そして。同じフォームのコピペするくらいなら、MovableTypeだけにもっと賢い方法があるでしょう♪
そ・れ・は テンプレートモジュール
早速いつものMTの管理メニューに入って、左端のメニューの「管理」から「テンプレート」を選び、「テンプレート・モジュール」という見出しのすぐ右下にある「新しいテンプレート・モジュールを作る」をポチっとな♪
「テンプレートの名前」には、これがコメントフォームであることがわかりやすい英字の名前をつけるといいと思います。わたしは「えーい、針中野ミュージックオリジナルコメントフォームじゃい!」ということで(どこがじゃ)「HMCommentFields」という名前をつけました。
そして「yujilog」を参考に作ったコメントフォーム MovableType のスパム対策(11) 「コメントスパム対策(10)」シリコンバレー 24時 (28-May-2006 追記:プレビューにも各種パラメータが引き継がれるバージョンになっています。こちらのバージョンのご使用を強くおすすめします)。枠内に表示されているものをまるごとずらずらずらっと「モジュールの中身」のところへえいっとコピペしましょう。
このフォーム例では、例のダミー変数が「TabClear」となっております。
実際にわたしが使っているフォームでは、変数が思い切り趣味に走ったものになっていて、ときどきネタを変えたりもしています。
どんな文字列を用いているかはコメントフォームのあるページを開いて参考にしてくださいな。きっと、このブログの読者の半数以上を占める某ミュージシャンのファンであれば、当然見覚えのある文字列のはずですから(当時。現在はまた別のネタに変更している。大文字小文字やハイフンのあるなしは別として)。

さて、せっかくつくったテンプレートモジュールを、テンプレートに適用しないことには意味がありません。

先ほどの
<MTCommentFields> あるいは <MTCommentFields preview="1" static="1"> と書かれている部分を、こう書き換えてください:

<$MTInclude module="HMCommentFields"$>

これで、デフォルトの <MTCommentFields> の代わりに、オリジナルのコメントフォーム(テンプレートモジュール)が適用されます(実際に適用されるのは、再構築後になりますが)。

あと、忘れちゃならないのが「個別エントリーアーカイブ」の修正。

<input type="hidden" name="entry_id" value="<$MTEntryID$>" />

と書いてある行が2箇所あるはずです。そのいずれにも、直後に

<input type="hidden" name="TabClear" value="ILikeStdColaBetter" />

こんな行を付け加えておきましょう。

ここでご注意。こちらの新しいテンプレートモジュールも、そして普通に修正する「個別エントリーアーカイブ」も、該当する箇所は2箇所ずつあります。できればエディタの「検索」あるいは「置換」で2箇所ともばっちり追加(修正)しておきましょうね。

以上の改造を施して、サイトを再構築したのち、一旦ふつうにコメントがつけられるかどうかをテストしておきましょう。ただし、現段階ではまだコメントスパム対策はできていません。仕上げの「mt-comments.cgi」改造が必要です。

"use strict;"文のすぐ下に以下を追加しました。

use CGI qw(:standard); if ($ENV{'REQUEST_METHOD'} eq "POST") {
my $data = param('TabClear');
die unless ($data);
}

これは、CGI呼び出し時に新しく追加した変数「TabClear」がないと die、つまりプログラムは強制終了しますよ、という意味です。
というのも、コメントスパムを送ってくる連中というのは、外部のフォームなり別プログラムから勝手に mt-comments.cgi を呼び出して、がちゃがちゃ無意味なコメントを送っていることが多いもの。そういったフォームやプログラムでは認識してはいない新しい変数を追加することで、そういう外部プログラムを排除しようというのが、今回の改造の目的なのです。
(但し、最近のちょっとレベルの高いコメントスパマーの中には、本物のフォームを解析して新しいダミー変数を解析し、スパム投稿プログラムに取り入れてしまうヤツもいるようです。それくらいの能力があるのならもっと別のことに使えばいいのにと思うんですがね…… いかがなもんでしょうか)

この改造を施した mt-comments.cgi をアップロードしたら、コメントがちゃんとできるかどうか動作確認してください。少なくとも、コメントのプレビューを見ないですぐ投稿、とプレビューを見てから投稿、の2通りは最低確認しましょう。
以上が正しく動作すれば、今回のミッション?はOKでございます。
♪それじゃぁソルジャー、どっつかっれさん♪

だけどさ、コメントスパマーなんぞのおかげで真面目なブロガーが骨折ってるのってどうよ……。
まったくもう。

最後になりましたが「女子十二月号」と「yujilog」はとても参考になりました。
厚くお礼を申し上げると同時に、謝意をこめてトラックバックさせていただきます。

トラックバック

この一覧は、次のエントリーを参照しています: コメントスパムなんて大嫌い for MovableType 3.1:

» MovableType のスパム対策(11) 「コメントスパム対策(10)」 送信元 シリコンバレー 24時
前回の 『MovableType のスパム対策(10) 「コメントスパム対策(9... [詳しくはこちら]

» MovableType のスパム対策(11) 「コメントスパム対策(10)」 送信元 シリコンバレー 24時
前回の 『MovableType のスパム対策(10) 「コメントスパム対策(9... [詳しくはこちら]

* comments *

* trackbacks *

* Drecom RSS *