プロ・クリエータの実践ウェブテクニック集



掲示板書き込みロボット対策

 最近、海外から発信されたプロキシを悪用した掲示板書き込みロボットが猛威を振るっています。 -> Spamの巣窟と化した掲示板

日付 : 2007-04-28 23:43:26 名前 : a 表題 : a 内容 : <a href=\"http://abreviations.obyt.info/\">abreviations</a> online [URL=http://abreviations.obyt.info/]abreviations[/URL] doc http://abreviations.obyt.info/ abreviations read http://accommodation.obyt.info/ accommodation read [URL=http://accommodation.obyt.info/]accommodation[/URL] read <a href=\"http://accommodation.obyt.info/\">accommodation</a> doc <a href=\"http://actors.obyt.info/\">actors</a> doc [URL=http://actors.obyt.info/]actors[/URL] doc http://actors.obyt.info/ actors video [URL=http://activities.obyt.info/]activities[/URL] doc

SPAMの遣り方

  1. ネット検索等でBBS, Guest Book, Chat等のURLを取得。
  2. フォームを解析して action(処理するスクリプトのURL)や method(送信方法)を取得する。
  3. 同様に、text, textarea, hidden の各タイプから、nameや value を取得する。
  4. 取得したデータで投稿スクリプトを自動生成。
  5. HTTP_REFERER を正規のフォームが設置してある URL に偽装。
  6. HTTP_USER_AGENT を偽装。
  7. プロキシサーバーを経由して活動開始。

解析

チェック項目 備考
投稿欄の内容 CMリンクの羅列 <a>タグ、XMLタグ有り
投稿欄に多く含まれる単語 cialis, generic, viagra 3つの単語のうち1つ以上が含まれる割合、ほぼ100%
投稿の周期 約30分おき 途中、活動停止の時間帯有り
REMOTE_ADDR 不特定多数 毎回異なる
HTTP_ACCEPT */* -
HTTP_ACCEPT_CHARSET - -
HTTP_ACCEPT_ENCODING - -
HTTP_ACCEPT_LANGUAGE - -
HTTP_USER_AGENT 数パターン 改変している
HTTP_CONNECTION Keep-Alive -
HTTP_PRAGMA no-cache -
HTTP_REFERER _URL_ 改変している
プロキシ情報 ほとんど未設定、たまに漏れ串 複数
  • REMOTE_ADDR, HTTP_USER_AGENT, HTTP_REFERER が操作または改変されており、環境変数チェックのみで阻止するのは困難。
  • 投稿内容に含まれる単語や<a>タグ、XMLタグを検出すれば、このロボットに関しては排除可能。ただし、他の正当な投稿に影響が及ぶ可能性がある。
  • 現在はほとんどが外国からのアクセスなので鎖国政策を採ればほぼ解決するが、今後派生したSPAMによって日本語を使用した書き込みや日本のプロキシ経由でのアクセスも十分考えられる。
参考:環境変数チェック

対策

 ロボットは「送信」ボタンを押下できません。従って書き込む際は、正規のフォームを経由せずに、直接 actionで指定されているURLに送信して来ます。正規のフォームからの送信か否かを判別できれば、ロボットからの書き込みを阻止することができます。
 「直接投稿」自体をSPAMだと断定すれば良い訳ですから、環境変数のチェックも必要ありません。「直接投稿」をすべて弾き飛ばします。

 一番良い方法は、ランダムでユニークな文字列を発生させ、それを入力してもらう方法でしょう。
次に、投稿者の手を煩わせず簡単な方法はというと、判定用のユニークな項目を前もって設定しておくという手があります。受信プログラム側でこの項目の name と value が一致するかを判断します。一度は悪人や悪行ロボットに取得されるかもしれません。その時は、name なり、value なりを変えてやります。小回りの効かない実行型ロボットは、そう易々とは変更できません。

<form action="/spam/bbs_robots.phtml" method="post"> ... <input type="hidden" name="mode" value="add"> <input type="hidden" name="robo" value="norobo"> ... </form> <?php if(isset($_POST['mode'])) { if($_POST['mode'] == 'add' && $_POST['robo'] == 'norobo') { add(); } else { print 'It is an illegal contribution !'; exit(); } } ?>

 私の管理している某掲示板では、現在のところユニーク項目1個のみで100%防御しています。弾かれたすべての投稿の解析をしていますが、明らかにこのロボットは日々進化して来ています。

  • 当初は漏れ串が結構有り、経由するプロキシの数がどんどん増えているのが見られました。
  • HTTP_REFERER が正確に正規フォームのあるURLを指す様になりました。
  • HTTP_USER_AGENT がほぼ固定されていたのが、不特定多数の値を吐き出すようになりました。
  • プロキシ関連の環境変数がほとんど隠蔽されるようになり、漏れ串が少なくなりました。

 ここまでくると、環境変数の判定では防御不可能です。相手がロボットなら、ロボット対策で解決するのが一番スマートな解決策です。

転送量の問題

 防御をしたとしても、相手が悪質なロボットだとサーバーの転送量も無視できません。30分おきにアクセスがあるとすると、例え10kbのファイルでも、1日480kb、1ヶ月15Mbもの無駄な転送が発生することになります。

 悪質なロボットに対しては、表示量をできるだけを少なくするか、早々にどこかに飛ばしてしまいます。相手のURLが判ればそこに飛ばしてやるのが一番良い方法ですが、そうでなければ、管轄のSPAM取締りURLに飛ばせれば手がかからなくて良いかもしれません。飛ばし先は、相手の迷惑にならないように慎重に設定する必要があります。

<?php if(isset($_POST['mode'])) { if($_POST['mode'] == 'add' && $_POST['robo'] == 'norobo') { add(); } else { header("Location: http://www.example.com/spamcop.shtml"); exit(); } } ?>