BBS/コメント/トラックバックspam対策

最近BBSやBlogに自動スクリプトを使っていろいろなサイトを宣伝することが流行していますね。BBSには関係ないアダルトサイトの宣伝のURLを書き込むことによりそのサイトへの誘導と検索エンジンでのランクアップを狙っているものです。

このような迷惑きわまりない行為はBBS spamとか コメント spamあるいは トラックバック spam と呼ばれています。

担当者はいくつかのBBSとBlogをメンテナンスしていますが公開してからだいぶ時間が経過しその存在が知れ渡ったようで、ある時期から大量のBBS spamとトラックバックspamが来るようになりました。

掲示板がEUCなのにS-JISで投稿されていることからブラウザを使って人間がやっているのではなく、あらかじめ登録してあるポスト用のURLに対して無人で自動操作されているということです。

ダイアルアップやADSLの動的アドレスからつないだPCから行われる以外にウイルスに感染したPCをリモートで制御するなどして自動的に送られているものと判別できるものもあります。無断でOpen Proxyのサーバーを経由して自動投稿されたものもあるはずです。

その操作元アドレスを調べてみるとかなりの割合で(特にlist.dsbl.orgという)ブラックリストに登録されていることが判明しました。

最近のspamメールはOpenProxyやゾンビ化したPCを使って送られているため今回のトラックバックspamとかなりオーバーラップしています。このためRBLを使ってそれを排除する仕掛けを検討し実施中です。

その1)Apache自体に仕掛ける

Apache1.3.Xで使えるモジュールが以下で公開されています。

http://www.blars.org/mod_access_rbl.html

これを説明通りにApacheのモジュールとして追加するとdeny via list.dsbl.org というような文法でRBLに登録されているIPアドレスからのアクセスを拒絶してくれます。

以下がファイルがあるディレクトリに .htaccess を置いてそこに設定した例です。直接httpd.confに記載してもかまいません。
<Files "trackback.php">
Order allow,deny
allow from all
deny via list.dsbl.org
deny via sbl-xbl.spamhaus.org
deny via bl.spamcop.net
deny via all.rbl.jp
</Files>
注意:これは実験段階の設定です。実際に使うRBLについては最下段の追記をご覧ください

上の例では特定のファイルtrackback.phpというファイルにアクセスしてきたときだけチェックするようになっています。こうしておけば他のページは普通に見ることができるのでダイアルアップユーザーに迷惑をかける(※)確率が減少します。
(※前につないだspammerがそのアドレスからspamを送るとそのアドレスが登録されてしまい、次のユーザがその影響をかぶる現象)

BBSであればPOSTするファイル名を指定します。ディレクトリ名を指定すればそのディレクトリ以下にあるすべてのコンテンツの閲覧を拒絶することもできます。wwwサーバーに仕掛けた時のRBLへの問い合わせ数はメールとは比較にならないほど多くなりRBLにもwwwサーバーにも迷惑をかけてしまうことになります。このため必要最小限のディレクトリを指定するようにしてください。このためファイルだけへの設定を強くお勧めします。

以下が実際に拒絶したときのerror_logです。

[Thu Apr 13 10:11:23 2006] [error] [client 83.19.105.194] client denied by server configuration: /home/XXX/XXX/XXX/trackback.php
[Thu Apr 13 10:13:53 2006] [error] [client 193.219.242.141] client denied by server configuration: /home/XXX/XXX/XXX/trackback.php

その2)スクリプトに仕掛ける

レンタルサーバーを使っている場合には自分ではApacheのモジュールを追加できないのでスクリプトにこのメカニズムを入れます。

以下はphpで書かれた掲示板に仕掛ける例です。perlも同一の方法でやることができるはずですのでperlが得意な方はこれを参考に書いてみてください。(参考:「RBL Query(問い合わせ)方法」)

掲示板には以下のようにtitle, name, mail, com, url, flg, noというフィールドがあるという前提です。

<input type="text" size="30" name="title">
<input type="text" size="30" name="name">
<input type="text" size="30" name="mail">
<input type="text" size="30" name="com">
<input type="text" size="30" name="url">
<input type="text" size="30" name="flg">
<input type="text" size="30" name="no">

これがPHPのソース(check_rbl.php)(コードはEUCで書いてあるという前提)

このスクリプトはspam行為があったらその状況をメールで送ってくれるようになっているので、スクリプト中以下の部分を自分のメールアドレスなどに変更してください。たまたまRBLに登録されてしまったアドレスからまじめな書き込みがあったときには管理人が代行して書き込むという使い方もできます。
	$to_addr ="report@example.com";
	$from_addr ="mymame@example.com";
	$the_subject="BBS spam report";
変更した上でACTION で指定されるCGI(PHPスクリプト)でスクリプトを変更し、書き込む前に check_spammer() という関数に上のフィールドを全部引数として渡します。ゼロが返って来たら登録されていないので書き込みを進める、1が返ったら登録されているので書き込みをさせない、という動きにします。
追記:
メールで送る必要が無い方のために簡易版を作りました。
これがPHPのソース(check_rbl2.php)(BBSなどで使っているコードは何でもかまいません)
書き込み動作をする前にこの関数 check_spammer() を呼び、0だったら書き込み可なので実際の動作、1だったら不可と判定されたので書き込んだふりをした偽メッセージを出すようにします。
スクリプトではチェックするRBLは以下の2つとなっていますが同じルールで追加すればそれについても調べてくれます。
array(".list.dsbl.org", ".all.rbl.jp");
注意:これは実験段階の設定です。実際に使うRBLについては最下段の追記をご覧ください

無駄なRBLを多数指定するとDNSの問い合わせが毎回発生してサーバーあるいはRBLに多大な迷惑をかけるのでくれぐれもご注意ください。

繰り返し同じURLの宣伝書き込みをされる場合はNGワード集を用意しておいてあらかじめそこにあるURLや汚い言葉の文字列があったら書き込みを保留するという方法もあります。完全版のcheck_spammer()に追加して組み込むとよろしいでしょう。これも極めて効果的です。
本スクリプト(check_rbl.php)は商用も含め自由に利用改変可能です。連絡していただく必要もありません。

追記:その後およびその後2もご覧ください。

Top