昨日はいきなり140件ものトラックバックスパムが届いた。これまで一日数件だったのが爆発的増大である。事前承認制をしいているとはいえウットウシイ。
日に1000件なんてことになる前にと、本気で対策を考えた。
折しも一昨日にmod_securityモジュールの設定を行ったばかりである。これはwebサーバーソフトのapacheにアドオンして使うもので、歓迎すべからざるアクセスをさまざまなフィルター条件で遮断できる。トラックバックスパムもmovable typeの前にまずapacheに受け付けられるのだから、mod_securityの防御が有効のはずだ。しかし、きのうの140件のうち排除できたのは100件で、残り40件はapacheを通過してmovable typeまで到達してしまっていた。もうちょっと防御率を上げたい所である。
いろいろ調査・検討してみた所では、スパマーは以下のいずれかの方法でトラックバックping URLを見出し、阿呆なトラックバックを投げつけて来る。
* おそらくmt/mt-tb.cgiというcgiが使われているだろうとあたりを付け、そのようなトラックバックURLを推測してダメ元でスパムを投げつけて来る。
* エントリーの中にHTMLのコメントの形でかかれているRDFなるセクション内のtrackback:ping=XXXという記述を探す。
* RSSのフィールド中にかかれているURLを探す。
* エントリーの下の方に表示されるトラックバックURLを探す。
もちろん人間ではなく適当なプログラムにやらせているのだろう。これらの情報のうちRDFとRSSの方のping URLは生身の人間にはほとんど役にたたないはずである。なぜこんなものを入れ込んだままにしておくのか設計者の意図は理解に苦しむものだ。ということで、全部削除することにする。
まずRSS対策。具体的にはデフォルトテンプレート(*.tmplという名前のファイル)において< $MTEntryTrackbackData>というのを見つけ出して削除してしまえばいいようだ。複数のファイルが該当したので、全部書き換えた。
次にRDFだが、これは対応策を見付けるのに苦労した。いわゆるテンプレートファイルではなく、ContextHandlers.pmなるperlモジュールを書き換える必要があった。
改変箇所。$rdfという変数の定義を書き換える必要がある。
$rdf .= <<RDF;で始まり、
RDF
で終る場所だ。
書き換える前は、
trackback:ping="$path"
という一行が上記箇所に含まれていた。この行をばっさり削除すればエントリーHTMLからtrackback:pingの記述は消える。
さて、しかし多くのスパマーはmt-tb.cgiメクラ打ち戦法をとっている様子である。そこで、mt-tb.cgiを非標準的な名前に改名してやる。名前は最後の.cgiさえ残していればなんでもよい(apacheの設定よってはここも変更可能)。私は類推しにくいようにと英語とローマ字を混ぜた名前にした。
ここまでで、ほぼ完璧にトラックトラックバックを水際で排除できたようだ。
しかし、このままでは善意のトラックバックもできないのである。Movable Type自身にトラックバック用cgiの新しい名前を教えてやらないといけない。これにはmt-config.cgiを書き換える。
次の記述を付け加える。
TrackbackScript 新しい名前.cgi
昔のバージョンではTrackbackScriptの記述が最初から存在するらしいので、もしそうなっていたらそれは削除しておく。
そして、全体を再構築。
これで完璧…のはずである。すくなくともこの半日は完璧な防御ができている。もう存在しないmt-tb.cgiに虚しくアクセスを試みているやつが、のべ50人…バカ共が、せいぜい頑張るが良いわ。
【2007年4月30日追記】
スパマーへの挑発的文章に逆切れしたのか知らんが、このエントリーにだけコメントスパムを投げつけてくる馬鹿があとを絶たない。うっとうしいのでこのエントリーにのみコメント・トラックバック全面禁止を設定することにする。