JavaScript によるコメントスパム対策

Posted by
ぴろり
Posted at
2005/05/28 00:30
Trackbacks
関連記事 (1)
Comments
コメント (1)
Post Comment
コメントできます
Category
MovableType カテゴリ
カバーイメージ
  • SPAM
  • Photo by AJC1
    • CreativeCommons
    • Attribution
    • NonCommercial

 ブログを持つものとして、コメントスパム対策は避けられない道にあるようです。当サイトでは幸いなことに未だにその害を被ってはいませんが、先輩諸氏のブログは日々、スパマーとの激烈な戦い(?)を繰り広げられています。
 現在、様々なコメントスパム対策が提案されていますが、これ一つで完璧と言える対策がないのが現状です。ブログ管理者は、これらの方法を上手く組み合わせることで、スパマーへの防御力を高めようとしています。

 このエントリでは、コメントスパム対策の 1 つの方法として、ブラウザの JavaScript を利用することを提案しています。先に述べたように、これも決して決定打と言える対策案ではありませんが、他の方法と組み合わせることで、効果的にスパムコメントをフィルタできるでしょう。この方法が、今のあなたの対策ロジックを少しでも強固にするお手伝いになれることを願って。

このエントリーをはてなブックマークに追加  

背景

 Web 上で検索できた幾つかの対策のうち、当サイトでも次の方法を参考に対策を行うことにしました。

1.コメント投稿時に隠し属性(hidden)データを送信する

 この手法は"女子十二月号:MovableTypeコメントスパム対策"で紹介されています。要はコメント投稿フォームにおいて、独自のデータフィールドを type="hidden" として埋め込み、コメント登録時にそのフィールドの存在をチェックするというものです。
 初期のスパムボットは Movable Type 標準に従ってリクエストを投げて来ていたため、これで弾くことができたようですが、最近のスパムボットはフォーム内のデータフィールドを検索し、hidden フィールドを偽装してリクエストをしてくるそうです。そのため、この手法は次第に効果が薄くなりつつあります。

2. コメントが全て半角英数字のものを拒否する

 "きままにポロポロ:続々コメントスパム"にある方法では、スパムコメントの多くが海外からのものであることを利用しています。一方、それに続く"きままにポロポロ:コメントスパム ひらがな対策"では、記事に句読点や連続した平仮名を必須とすることを提案されています。これは半角英数のみのコメントを弾くのではなく、一般のお客様(=その多くは日本人)から頂くコメントの特徴を上手く使った方法で、かなり強固な対策に見えます。
 しかし、この方法であっても、スパムコメント中に本文から適当に数行をコピー&ペーストするような対策を打たれてしまうと効果がありません。また、このルールを回避するための日本語テンプレートが出回ることも懸念されます。

 上記の 2 つの手法は、ルールが比較的単純で対策プログラムが組み易く思えます。現在のスパムボットは巡回しているブログページの HTML を文字解析しているものと推測されますが、例えばこれに;

  • hidden 属性のフィールドを発見したらリクエスト URL に追加する
  • ページ先頭から 2 バイト文字を 100 バイト分コピーしてコメントに付加する

という対策を取られてしまうと、コメントスパムを判別することが難しくなります。 そしてまた、この程度のスパムボットであれば Perl などで容易に書けてしまいそうです。

 コメントスパム対策として注目すべき点は、一般のお客様はブラウザを介してコメントを投稿しますが、スパムボットは直接にコメントを投稿してくる、という点でしょう。もう少し詳しく言えば、お客様のブラウザはページの意味を理解してコメントを投稿しますが、スパムボットはページの文字を眺めてコメントを投稿してきます。
 そこで JavaScript が登場します。通常のブラウザはページに埋め込まれた JavaScript の文字解析・構文解析を行い、スクリプトを理解し、その実行を経て結果を導き出します。それに対してスパムボットが JavaScript を眺めただけではその結果を出すことはできません。これに対応するには、スパムボットが JavaScript の文字解析・構文解析・実行エンジンを持つ必要があり、その対策コストは格段に大きくなることが予想されます。今回のコメントスパム対策はこの特徴を利用します。

コメントスパム対策

Step.1 - hidden 属性を埋め込む

 コメント投稿フォームに hidden 属性で独自データを埋め込みます。ここまでは先の方法と同じなのですが、送信される値には不正な値を与えておきます。スパムボットが何も考えずに正直にこの値を送信すると、それはコメントスパムということになります。

<!-- コメント登録フォーム中に -->
<form name="comments_form">
	<!-- hidden フィールドを追加しておく -->
	<!-- 'enable' とかそれっポイ値だが、実は NG!! (・∀・) -->
	<input type="hidden" name="script_auth" id="script_auth" value="enable">
</form>

Step.2 - JavaScript を埋め込む

 次にブラウザでページが開かれた時に、先のフィールドに正しいデータを埋め込み直すための JavaScript を追加します。このスクリプトはページの最後にでも追記して必ず実行されるようにします。また、お客様には JavaScript を有効にして頂く旨を書いておく方が安全かも知れません。
 この例では McCarthy(マッカーシー) 関数という聞いたこともないような計算をしていますが、とりあえずこの関数は必ず 91 という結果になります(笑) 従って、本来のお客様は script_auth が enable ではないわけです。 …まぁ、スパムボットが本腰を入れて対策をしてくるまでは、この関数はもっと簡単なものでも構わないかもしれません(例えば、1+2+3+4+5...を計算するようなもの)

<script language="JavaScript"><!--
// JavaScript が有効でないと通常のコメントも弾かれるので注意
// 本当の値は下の関数で計算している
function McCarthy (n)
{
	if (n > 100)
		return n - 10;
	return McCarthy (McCarthy (n + 11));
}
// document.comments_form.script_auth.value = '正しい値' では
// 文字解析レベルで対策される可能性があるため。
document.comments_form.script_auth.value = McCarthy (1);
//-->
</script>

Step.3 - mt-comment.cgi で拒否する

 最後に送信されたデータが正しい値か判定し、不正な値であった場合はエラーとなるように mt-comment.cgi を修正します。 この部分の処理は先の 3 つのサイトで紹介されている部分を参考に修正します。

use CGI qw(:standard);
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
	my $data = param('script_auth');
	### McCarthy 関数は常に 91 を返します
	### 関数部分を変更したときは、その返値に合わせてください
	die if ($data ne '91');
}
このエントリーをはてなブックマークに追加  



関連記事/トラックバック (全 1 件中、最新 5 件まで表示しています)

モーグルとカバとパウダーの日記 のスクリーンショット
タイトル
[pc][spam]Javascriptを利用したコメントスパム対策
Trackbacked at
2007/06/25 17:27
from
モーグルとカバとパウダーの日記
概要
MT-Keystrokes というMT用プラグイン - モーグルとカバとパウダーの日記 こちらのコメントで教えていただいた、MT-Keystrokesと...

この記事にトラックバックを送るには?

寄せられたコメント (全 1 件中、最新 5 件まで表示しています)

Posted by
ぴろりぴろり
at
2005/05/28 01:21
ID
QiUCMskk
…なんて書いておいて自分が弾かれたらイヤだなぁ…
(;=ω=)ノ ちとテスト

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。