掲示板スパムクローラーの話

 私の運営しているサイトのメール送信フォーム宛に、英文のスパムコメントが、かつて毎日のように送られてきた時期がある。投稿者のハンドルが「RuleZ016」と言えば一部の人には話が早いだろうか。
 CGIプログラムを手直ししてメッセージフィルタを追加したことでピタリと止んだが、調べてみたところ、どうやらこのスパムクローラーの動作原理自体は比較的単純のようである。

  1. スパムクローラーはまず、宣伝投稿のターゲットとする掲示板を、いろんなサイトを巡回して探し出すが、それは「formタグを使用し、method=POSTで送信しているフォーム」という条件である。まあ何て単純ですことオホホホホ。つまり先に挙げたメール送信フォームへのスパムコメントは、そこが掲示板だと誤判定されたようだ。フリーソフトとしてソースのまま配布しているCGIスクリプトがあるが、そのソースファイルにaction="$self"と書かれているからといって、/$selfにデータをPOSTしている形跡もあった。CGIではなくただのhtmlファイルなのに、<form action="" method="POST">と書かれたダミーのフォームを見付けると、そのhtmlファイル自体にPOSTしたりとか、おバカな判定が多いものだ。
  2. スパムクローラーはその際、大抵はフォームの存在するURLの方を記録として残しておく。そのため、たとえばメール送信フォームの場合、CGIプログラムのURLを変えても無駄である。呼び出し元のhtmlファイルが同じ場所にあるなら、そこのformタグに書かれたPOST先を追尾されてしまうからである。htmlファイルの置き場所を変えるか、CGIプログラムにスパムフィルタを付けるかする必要がある。
  3. スパム投稿プログラムが実際に投稿する際には、プロクシないしはボットネット?を使用して、フォームの存在するhtmlファイルをまずは調査する。次に、そこで得た情報を元にし、(必要なら別のプロクシあるいはボットネットの別のマシンに切り替えた上で、)実際のCGIプログラムにPOSTする。


 スパム投稿プログラムから投稿された実際のアクセスログとしては、以下のようになる(一部伏字)。

colo-69-31-**-***.********.com - - [01/Jul/2006:16:20:46 +0900] "GET /comment.html HTTP/1.0" 200 1360
211.200.***.** - - [01/Jul/2006:16:20:49 +0900] "POST /cgi/webform/ja.cgi HTTP/1.0" 404 284


 一行目がhtmlファイル読み込み、二行目が実際の投稿である。リモートホスト名が変わっていることに注目していただきたい。もっとも、場合によっては同じIPアドレスということもある。


 さて、対策はどうすればよいか。実は上のアクセスログでは、二行目のステータスが404となっているが、このCGIにはスパムフィルタを用意してあり、スパム投稿にしか存在しないNGワードを入れると404 Not Foundエラーを返すようになっている。そこまでしなくとも、CGIにスパムフィルタを用意しておくのは一つの方法である。具体的には、本文中に「<a href=」とか「[url=」が含まれている場合はスパム投稿とみなして撥ねる、これでこの種の英文スパムの多くを排除する事ができる。
 CGIプログラムを自作する時、それがフォームからPOSTする作りである場合は、簡単なものでいいので、スパムフィルタを組み込んでおくと、後々応用が利くだろう。たとえば「http://」が本文中に含まれている投稿を許可しないだけでも、9割以上のスパム投稿は排除できる*1
 以前にも書いたが、URLやメールアドレスや電話番号など、連絡先を何かしらの方法で書いておかないと、宣伝の意味をなさない。これがスパム投稿のアキレス腱である。このアキレス腱を何かしらの方法で切ることこそ、掲示板スパム対策の早道である。

*1:もしそういう投稿を場合によっては許可したいなら、一旦保留にした上で、管理者の許可があって初めて公開されるようにプログラムを作っておくとよい。