コメントスパム対策の落とし穴
以前、コメントスパムの対応をお手軽に.htaccessで行ったのですが、落とし穴がありました。
確かに.htaccessでリファラが自サイトでない場合にアクセス拒否することはできるのですが、mt-comments.cgiの動作そのものを防ぐことはできないのです。そのため、
「スパムは弾くけどそのたびmt-comments.cgiが動作して重くなる」
という症状が発生しました。
2重の防御
そこで、
- mt-comments.cgiの名前を変える
- 変えた名前を知られないようにする(偽のアドレスに誘導する)
という2重の対策を施しました。
1. mt-comments.cgiの名前を変える
これについては、あちこちで書かれているので難しいことではありません。まずはMovable Typeがインストールされたディレクトリで、
$ mv mt-comments.cgi comments-nospam.cgi
のように名前を変更します。これだけではMovable Typeが名前の変更を検知できないので、mt-config.cgiに次の行を追加します。
CommentScript comments-nospam.cgi
青字の部分はお好みで変えてください。簡単には分かりにくい名前にするといいでしょう。
2. 変えた名前を知られないようにする
せっかく名前を変えても、コメントスパムのプログラムがそれに対応してしまっては意味がありません。そこで、変えた名前を知られにくいように、コメントフォーム自体に細工をします。
まず、「コメント入力フォーム」テンプレートの最初の行
<form method="post" action="<$mt:CGIPath$><$mt:CommentScript$>" name="comments_form" id="comments-form" onsubmit="return mtCommentOnSubmit(this)">
を次のようにします。
<form method="post" action="/nospam.html" name="comments_form" id="comments-form" onsubmit="return mtCommentOnSubmit(this)">
青字が変更部分です。/nospam.htmlという名前は任意のものでかまいませんし、存在しないファイル名でもかまいません(他人のWebサーバに向けたりするのはやめましょう)。
で、これだと投稿先が存在しないHTMLファイルになってしまいますが、その下に以下のようなJavaScriptコードを入れておきます(</form>の次の行に入れるといいでしょう)。
<script type="text/javascript">
<!--
document.comments_form.action = '<$MTCGIPath$>';
document.comments_form.email.value = mtGetCookie("mtcmtmail");
document.comments_form.author.value = mtGetCookie("mtcmtauth");
document.comments_form.url.value = mtGetCookie("mtcmthome");
document.comments_form.action += '<$MTCommentScript$>';
if (getCookie("mtcmtauth")) {
document.comments_form.bakecookie[0].checked = true;
} else {
document.comments_form.bakecookie[1].checked = true;
}
//-->
</script>
何をしているかというと、上記の"/nospam.html"というアクション先を正規のコメント投稿スクリプトに書き換えています。
action変数への代入は2段階に分けて行い、2つの代入を少し離すことでわざと分かりにくくしています。
ちなみに、mtGetCookieという関数はMovable Type 6の場合です。参考にさせていただいたこちらのフォーラムにあるように、以前のバージョンでは"getCookie"という関数だったようです。
効果のほどは?
絶大です。いままでのコメントスパムはHTMLを読み込んだ上で<form>タグを静的解析してそのaction先にポストしているようで、access logを見るとコメントスパムが/nospamへ誘導されているのが分かります。
たとえばこんな感じ。
220.200.58.90 - - [09/Mar/2015:10:00:00 +0900] "GET /blog/2015/02/miele-autoopen.html HTTP/1.1" 200 15406 "https://www.markn.org/blog/2015/02/miele-autoopen.html" "Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0"
220.200.58.90 - - [09/Mar/2015:10:00:01 +0900] "POST /nospam.html HTTP/1.1" 200 20 "https://www.markn.org/blog/2015/02/miele-autoopen.html" "Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0"
これを見ると、220.200.58.90というサイトは、まず
https://www.markn.org/blog/2015/02/miele-autoopen.html
にアクセスし、その中身を解析し、<form>にスパムをポストしようとして、
https://www.markn.org/nospam.html
に落ちています。ほんと、面白いように釣れます。アクセス先がスクリプトではないので、負荷もかかりません。
あまりに面白く釣れるので、このnospam.htmlに一定回数以上アクセスしたホストを.htaccessでブロックするスクリプトを組みました。定期的に実行すれば自動スパム対策が可能になります。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!