blogを「Movable Type 5」(以下、MT5)に変更しましたが、ここのところ、やたらとスパムコメントが付くようになりました。
(記事の更新情報をpingするにも、一長一短があります)
MT5にもスパムフィルタがあり、コメントの内容を監査して、ある一定以上のスコアとなると、自動的に隔離されるようになっています。
とはいえ、コメントをいったん受け付けてからスパム判定するようになっていることと、スパム判定した後も、そのIPアドレスからのコメントを拒否する訳ではないので、公開されないコメントが、裏でどんどん増えていくことになります。
勝手にサーバのリソースを使われるのは、気持ちの良いものではないので、MT5と連携した形で、スパムフィルタを作ってみました。
上記は、スパムと判定されたIPアドレスの一覧です。
ホスト名からすると、大部分が中国のプロバイダからのものとなっています。また、DNS解決できないIPアドレスも、逆アクセスしてみると、中国の監督官庁のサイトであったりします。
(当局も、よもや不正アクセスの踏み台にされているとは、まったく気付いていないことでしょう)
スパムフィルタの仕組みは簡単で、MT5がスパムと判定したIPアドレスを、SQLサーバから聞き出して、Webサーバの「.htaccess」ファイルに、「deny from (IPアドレス)」として追加するだけです。
あわせて、確認用(というか、全世界に曝すため0xF9D1)に、スパムテーブルファイルを更新します。その内容を表示したものが、上記となります。
この操作を、1日に1回、自動的に実行します。
いったんスパムテーブルファイルに登録されたIPアドレスは、Apacheレベルで門前払いとなるため、以降、二度とアクセスすることができなくなります。
これで、サーバのリソースを勝手に使われることもなくなりました。めでたし、めでたし。
(いっそのこと、中国からのアクセスは、すべて拒否ってやろうかとも思ったのですが、いまのところ思い留まっています)
これまで「アクセスログ分析」のページはCGIで作っていましたが、これを機に、PHPに書き改めてみました。
以下、スパムフィルタのソース(一部)です。
はじめに、スパムテーブルファイル(spamtable.dat)を読み出し、配列($SpamTable)に格納します。
つぎに、SQLサーバから、スパム判定されているコメントについて、IPアドレスと登録日時を、日付順に読み出します。
(MT5では、スパム判定されたものは、“comment_junk_status”が-1となっています)
つづいて、この情報を、配列の内容と比較し、登録されていない場合には、配列の最後に追加します。
最後に、スパムテーブルファイルを追記モードでオープンし、新たに登録された情報のみ、書き出します。
(念のため、バックアップファイルを作成するとともに、追記(書き込み)であることから、排他処理をしています)
ということで、スパムフィルタができました。
その効果ですが、スパムコメントの登録数が大きく低下し、サーバの負荷状態も改善したようです。
スパムコメントは、踏み台とされるIPアドレスがつぎつぎに増えているため、完全に抑え込むことはできませんが、システムが日々自動的に追加していってくれるので、管理的には楽になりました。