Movable Typeのスパム対策(コメント編・その1)
Posted by 琉羅 at 2007年04月20日 10:36
- 2007.6.5追記・・・不具合があったのでエントリーを修正しました
来るか来ないかは別にして、当ブログには最初からトラックバックとコメントにある程度のスパム対策を施しております。それで私が実際に対策したMovable Type
のスパム対策をいくつかご紹介させていただこうかと思います。
その第1弾として、コメントスパム編を・・・といっても、自分用の備忘録みたいなものですが、それでもよろしければ。
mt-comments.cgiのリネーム
まずは基本から。コメントを処理するプログラムである"mt-comments.cgi"をリネームして対策しようというもの。スパマーはこのプログラムにロボットなんかで直接送信するという話をよく耳にします。このプログラムの名称はMovable Type
を普通にインストールしているとまず皆同じになりますので、まずこのプログラムの名称自体を変更して爆撃を防ぐ訳です。
方法も至ってシンプルで、まずは"mt/mt-comments.cgi"を好きな名称にリネームします。
- comment.cgi
- hoge-comments.cgi
- hogehoge.cgi
など、自分が分かれば何でもよいでしょう。
次に、"mt/mt-config.cgi"の一番最後でよいので、
CommentScript hogehoge.cgi
と記述します。もちろん青字の部分は自分でリネームした名称にしてください。
最後にブログ全体の再構築が必要な場合は、全てを再構築します。その際に必ず"mt-site.js"も一緒に再構築されているかどうか確認してください。これでこの対策は完了です。
コメントプログラムの名称を隠蔽する
先程の対策で"mt-comments.cgi"の名称を変更することはできましたが、もちろんこれだけでは不十分です。なぜなら、スパムロボットはHTMLを解析してしまうから・・・つまり、フォームを設置しているページにせっかく変更したコメントプログラムの場所や名称がはっきりと記載されているからなのです。
そこで、JavaScriptを利用してプログラム名を隠蔽してしまおうというのが、
に掲載されています。詳しいことは読んでいただけると分かると思いますので、ここでは方法だけを簡単に説明させていただきます。
対象はコメント投稿フォームがあるテンプレート全て(エントリー・アーカイブ、コメント・プレビュー、コメント・エラーなど)で、下記の部分にある赤字部分を削除し、青字部分を追加してください。
:
<MTEntryIfCommentsOpen>
<form method="post" action="<$MTCGIPath$><$MTCommentScript$>" name="comments_form" onsubmit="if (this.bakecookie.checked) rememberMe(this)">
<input type="hidden" name="static" value="1" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
:
</form>
<script type="text/javascript">
<!--
document.comments_form.action = ["<$MTCGIPath$>", "<$MTCommentScript$>"].join("");
//-->
</script>
</MTEntryIfCommentsOpen>
:
ただ、この方法はJavaScriptが有効になっていないとコメントが投稿できませんので、
<script type="text/javascript">
<!--
document.comments_form.action = ["<$MTCGIPath$>", "<$MTCommentScript$>"].join("");
//-->
</script>
<noscript>コメントを投稿するにはJavaScriptを有効にしてください</noscript>
と、注意書きしておくのも良いでしょう。
余談ですが、<form>タグにname属性を入れるとXHTML1.1ではValidすることができません(XHTML1.0 Transitionalは問題なし)。私を含めて気になる方は、
を参考にして下記のようにname属性をid属性に変更し、JavaScript部分を
:
<MTEntryIfCommentsOpen>
<form method="post" action="" id="comments_form" onsubmit="if (this.bakecookie.checked) rememberMe(this)">
<input type="hidden" name="static" value="1" />
<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
:
</form>
<script type="text/javascript">
<!--
document.getElementById('comments_form').setAttribute("action", ["<$MTCGIPath$>", "<$MTCommentScript$>"].join("") );
//-->
</script>
</MTEntryIfCommentsOpen>
:
のように変更してください。
こんな方法があるなら、さっきのリネームは意味無いんじゃないか?と思われるかもしれませんが、最初にも書いたように直接"mt-comments.cgi"を狙い撃ちしてくるスパムボットもいるようで、これらを併せて対策することで効果があるものと思ってください。
これだけしておけば十分だろうと思われるコメントスパム対策ですが、私は更なる対策を施しました。このまま書こうかとも思ったのですが、長くなりますので次回に続けたいと思います。
エントリー中のJavascriptを利用してコメントプログラムの隠蔽をする際、XHTML1.1にValidするために<form>タグのname属性をid属性に変更する方法を紹介しておりましたが、このままではコメントフォームにある「ブラウザに情報を保存する」のチェックが外れてしまう(正確にはCookieの読み出しができていなかった)という不具合が発生することに今さら気付きました。
修正方法としましては、テンプレートにある"mt-site.js"の100行目辺り
:
if (document.comments_form) {
if (!commenter_name && (document.comments_form.email != undefined) &&
(mtcmtmail = getCookie("mtcmtmail")))
document.comments_form.email.value = mtcmtmail;
if (!commenter_name && (document.comments_form.author != undefined) &&
(mtcmtauth = getCookie("mtcmtauth")))
document.comments_form.author.value = mtcmtauth;
if (document.comments_form.url != undefined &&
(mtcmthome = getCookie("mtcmthome")))
document.comments_form.url.value = mtcmthome;
if (document.comments_form["bakecookie"]) {
if (mtcmtauth || mtcmthome) {
document.comments_form.bakecookie.checked = true;
} else {
document.comments_form.bakecookie.checked = false;
}
}
}
:
の赤字部分"comments_form"を、
:
if (document.getElementById('comments_form')) {
if (!commenter_name && (document.getElementById('comments_form').email != undefined) &&
(mtcmtmail = getCookie("mtcmtmail")))
document.getElementById('comments_form').email.value = mtcmtmail;
if (!commenter_name && (document.getElementById('comments_form').author != undefined) &&
(mtcmtauth = getCookie("mtcmtauth")))
document.getElementById('comments_form').author.value = mtcmtauth;
if (document.getElementById('comments_form').url != undefined &&
(mtcmthome = getCookie("mtcmthome")))
document.getElementById('comments_form').url.value = mtcmthome;
if (document.getElementById('comments_form')["bakecookie"]) {
if (mtcmtauth || mtcmthome) {
document.getElementById('comments_form').bakecookie.checked = true;
} else {
document.getElementById('comments_form').bakecookie.checked = false;
}
}
}
:
このように青字部分"getElementById('comments_form')"へ全て変更して「保存と再構築」すればOK。それでも不具合が修正されない場合は、一度サイトのCookieを削除してからお試しください。
尚、この修正は<form>タグのname属性を残している場合は必要ありません。
トラックバックスパム防止のため、末尾の XXXXXX 部分を上記画像の数字に置き換えてからご利用ください。お手数ですがご協力よろしくお願いいたします。


