PHP Note
category: サイト運営 無し≫ 携帯端末

積極的なスパム投稿対策

created: 2009-05-10 | modified: 2010-05-20

投稿を受けた時に IP や User-Agent、投稿内容等でのフィルタリングは掲示板SPAM対策に欠かせません。もちろんうちでもフィルタリングは施していますが、受身な対策なだけにスパム投稿そのものが減るわけではありません。

ここしばらくブログで綴ってきたスパム投稿対策やログ解析を元に、掲示板スパム投稿そのものを減らす積極的な対策を考えてみました。


2010-04-12
スパム投稿のフィルタリングはこちらをお試しください。既存のPHPアプリケーションに組み込んで使います。特定のウェブフォームから投稿するもなら掲示板でもブログのコメントでも使えます。投稿内容をチェックするのとはちょっと違う掲示板スパムフィルタです。


掲示板スパムボットの特徴

2009年5月現在うちのBBSに来てるスパムロボットは2種類。このうちひとつを 'AHoo+C' と勝手に名づけています。このスパムロボットにはこんな特徴があります。

  1. Proxyサーバ経由 - 99%以上が海外のホスト。日本のホストがたまにある。
  2. Cookieが有効。
  3. User-Agentはまちまち。
  4. Referer が同じ。(投稿フォームのURL)
  5. 投稿フォームを収集して、2、3秒後に同じホストより投稿。その後5~20秒おきに、国が異なる別ホストよりPOSTとCOOKIE等まったく同じ内容の投稿が1~3回程度続く投稿パターン。
  6. 投稿フォームと投稿先以外にリクエストは無い。他のページはもちろんのこと、画像やJavascript、CSSなど投稿フォームに付随するファイルも一切リクエストが無い。
  7. 投稿後のレスポンスは無視。

こんな特徴から、'AHoo+C' は次のような手順で投稿を繰り返していると推測できます。

  1. 投稿フォームのURLを入手しデータベース化
  2. 公開Proxyサーバの情報を入手しデータベース化
  3. Proxy経由でフォームのURLをリクエストする
  4. 3で得たレスポンスからリクエストを作成する
  5. Proxy経由で投稿URLにリクエストを送信する

1と2は準備段階で投稿業者の資本となるところです。投稿業者も先ずは投稿フォームのURL入手する必要がありますが、この方法のひとつとして人力で探してると思われる痕跡がありました。Googleで「新規投稿 BBS」を検索しやってきたRefererが残っていました。
別の方法としてロボット巡回による収集というのも考えられなくはありませんが、収集システムとデータ量に掛かるコストを考えると、人力で収集したデータベースがスパム業者の間で流通してると考える方が現実的だと思います。 (以下の 2009-05-20 追記 を参照)

3、4、5は実際投稿してるところ。リクエスト間隔や、投稿フォームと投稿先以外のリクエストがまったく無いことから、ロボットにより全て自動的に行っていると推測されます。
試しにフォームの action の URL を変えたところすぐに新しいURLに投稿があったので、投稿先のURLをあらかじめ決め打ちしてるのではなく、3で得たレスポンスからリアルタイムでリクエストを作成しているようです。

もう察しがつくと思いますが、「スパム投稿業者に投稿フォームのURLを渡さない」これが最も積極的な対策になります。ただ、完全に閉ざされたコミュニティでも無い限り100%阻止は無理ですが、パブリックなフォーラムでもスパム投稿そのもを減らす対策はあります。

2009-05-20 追記

この記事を書いた5/10に、下の「アンカー(Aタグ)によるリンクをやめる」の location.href による対策を実施しましたが、その直後から 'AHoo+C' による投稿がピタリと止みました。即効性があったということは、投稿フォームのURL収集もロボットにより自動で行われてる可能性がとても高くなります。
そこで アンカーによるリンクに一旦戻して、どんなロボットが投稿フォームのURLを収集しているのか様子を見てみました。

URL収集ロボットにRefererは全く無くホストはProxyサーバでしたので特定不可能でしたが巡回パターンに特徴があります。初めに掲示板の記事のひとつにリクエストがあり、そのページにあるリンクが順にリクエストされています。このパターンが1日に1~3件ほどあり、初めのアクセスは必ず掲示板の記事でした。この巡回のあと数時間あけてSPAM投稿があります。

このことから、投稿フォームのURLをデータベースに持ってるのではなく、Googleなどの掲示板の検索結果を元に巡回してくるのではないかと推測されます。Googleなら常に新しい情報に更新され続けますし、投稿業者自身で収集システムもデータベースも持つ必要が無い、投資のいらない情報源ってわけです。

こうなると、アンカータグを使わずにリンクし投稿フォームを隠すことが最も効果的と考えられます。また location.href に戻したので、今度は効果のほどを見たいと思います。


投稿フォームを隠す

検索エンジンのインデックスを無効にする

投稿フォームが発見されなければ投稿もできないというとても単純ではありますが一番基本的で外せない対策です。普通なら早くインデックスされるよう内部的SEO対策をされてると思いますが、投稿フォームに限ってはこの逆をやっていきます。

robots.txt

以下のように書いた robots.txt をドキュメントルートに置き、クロールして欲しくないURLを検索エンジンのクローラに伝えます。

User-agent: *
Disallow: /bbs/postForm

これで「すべてのUser-agentさんへ、/bbs/postForm(投稿フォームのパス)をクロールしないでね」というお願いになります。あくまでもサイト管理者の意思表示ではありますが、まっとうな検索エンジンならこの指示に従ってくれます。


METAタグのrobots
<meta name="robots" content="noindex" />

投稿フォームの head にこのMETAタグを書いておくと、「このページをインデックスしないでね」というお願いになります。こちらもまっとうな検索エンジンなら管理者の意思を尊重してくれます。


検索結果への非表示を申請(設定)する

すでにインデックスされたものについては、YahooサイトエクスプローラGoogleウェブマスターツール にて検索結果に表示しないよう申請できます。
MSNにはこれに類似したサービスを見つけられませんでしたので、ダメ元で Live Search 右下の「ご意見ご感想」からお願いしておきました。


サイトマップからURLを削除する

もし投稿フォームのURLをサイトマップ(sitemap.xml)に載せてるなら削除しておきましょう。


アンカー(Aタグ)によるリンクをやめる

クローラはページに含まれてるアンカー(Anchorタグ)をたどってページを収集するので、投稿フォームにリンクが張ってあればこれも対象となります。大手の検索エンジンはクロールしても robots.txt によりインデックスされませんが、robots.txt を読みにいかないダウンロードツールなどに対して投稿フォームのURLを隠しておくことも必要です。

例えば、投稿フォームのリンクを Javascript で動的に書き出すとか。SCRIPTタグが無視されることもありえるので適当に分解する。

<script type="text/javascript">
var formAnchorTag = '<' + 'a' + ' href="' + '/bb' + 's/postForm"' + '>' + '投稿フォーム' + '</a>';
document.write(formAnchorTag);
</script>

例えば、location.href でページ移管するとか。

<a href="javascript:void(0)" onClick="javascript:location.href='/bbs/postForm'; return false;" />投稿フォーム</a>

Javascript が使えないクライアントが対象なら、FORMタグでリンクするとか。

<form method="get" action="/bbs/postForm">
    <input type="submit" value="投稿フォーム" />
</form>

スパム投稿は速やかに削除する

先に「新規投稿 BBS」の検索結果から来た業者を挙げましたが、これに似た手法として、過去に投稿されたスパム投稿を検索してくる業者がいます。業者にしてみれば投稿が成功した実績のある格好のターゲットです。もし投稿されたら検索エンジンのクローラが訪れる前に削除してしまいましょう。

* * *

うちに掲示板の動作サンプルを置いてた頃は毎日山のようなスパム投稿があり、これを撤去しても半年くらいはスパムのリクエストが続いてました。フォームを隠しても投稿業者のデータベースから消されるまで時間がかかるので、こちらも粘り強さが必要です。


投稿を受けるURLを隠す

投稿フォームをJavascriptで書き出す

Javascriptが有効なクライアントだけを対象とすることになりますが、ページに付随するJavascriptを収集しないロボットに対しては100%効果が期待出来るうえ即効性もある一番オススメのスパム投稿対策です。投稿フォームを隠す役割も兼ねています。

うちの掲示板の返信フォームは Ajax で得たフォームデータをJavascriptで書き出しています。この仕様に変えてからは返信フォームに対するスパム投稿は一件もありません。記事の観覧と投稿フォームが一緒になっている掲示板やブログのコメントフォームなど、他の対策を施しにくい場合にも適しています。


投稿先URLをJavascriptで書き換える

この方法は簡単なわりに極めて有効です。form の action を空にしておいて、送信前に DOM でform の action を正しい投稿先URLに書き換えます。

<form id="postForm" method="post" action="" onSubmit="return validateForm();">
  <input type="text" name="title">
  <textarea name="comment"></textarea>
  <input type="text" name="name">
  <input type="submit">
</form>

validateForm()

function validateForm() {
  var elm = document.getElementById('postForm');
  elm.action = '/bbs/post';
  return true;
}

Javascriptを読まないロボットは投稿先のURLがわからないので投稿できませんが、Javascriptを備えたクライアントなら難なくパスして正しいURLに投稿できます。

action が空だと投稿フォームのURLかドキュメントルートが投稿先と判断される可能性があるので、考えてみたのが action にプライベートアドレス(http://127.0.0.1/)を指定する方法です。
理屈上プログラムが動いているコンピュータ自身を示すIPなので、スパム業者が自分のコンピュータに対して投稿する構図が成り立ちます。ただしそのコンピュータがISPなど第三者が所有してる可能性もあるので、プライベートアドレスの指定はもっと検証を重ねてから試したいと思います。

現在、うちの掲示板の新規投稿フォームは、action にダミーのURLを指定してリクエストをログに取り、スパムのブラックリスト作成に使っています。

理想を言えば、警察などの公的機関がこうしたスパムの投稿先URLを設けてくれると、投稿業者が高いリスクを負うことになり、スパム投稿撲滅の決定的な対策になるんですけどね。

2009-05-31 追記

ダミーのactionに ブログを置いてるサーバのURLを指定し様子をみてたところ 一度も投稿されませんでした。(参照:掲示板スパムのリクエストを75%カット
掲示板スパムボットは、違うホストに投稿してこないということなので、プライベートアドレス指定も有効といえます。


ユニークなURLに変える

私は Blog システムに WordPress を使っています。こうしたソースコードが公開されているアプリケーションではスパム業者にも投稿先のURLが丸見えです。フォームを解析する手間がいらないぶん格好のターゲットになります。

そこで公開されているアプリケーションを使う場合は、投稿先のURLをオリジナルとは違う独自のURLに変えてしまいましょう。最近のアプリケーションは実行するファイルをURLマッピングで簡単に変えられるようになっているものが多いです。そうでない場合は投稿を受けるファイル名を変えると(アプリケーションによっては手直しが手間なこともあります)、特定のスパムボットに対してはかなり効果的です。


* * *

スパム投稿を普通の生活に置き換えると、よその店先にチラシを貼り付けてまわるようなものか、仲間内で盛り上がってるところに割り込んできて別の話題を振ってくる赤の他人ってところだと思います。XSSを仕込んだ投稿などもっと悪質なケースもあります。こんなことに大切な時間や財産を食いつぶされてはたまりませんので断固アンチスパム(Anti-SPAM)で参りましょう。

「投稿フォーム」と「投稿を受けるURL」この2つを守り切れば、スパム投稿業者も資本が得られなくなり商売あがったり、儲からないとなれば投稿業者も別の道を考えるでしょう。
フィルタリングによるスパム対策とあわせて、こうした積極的な対策もどうぞ実施してください。みんなでやればいずれはスパム投稿の無いネット社会も出来るはずです。


category: サイト運営 無し≫ 携帯端末
PHP Note
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新したNote
よく読まれている記事
Yahoo Search

最近更新された掲示板トピックス
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑