ブログを持つものとして、コメント
スパム対策は避けられない道にあるようです。
当サイトでは幸いなことに未だにその害を被ってはいませんが、
先輩諸氏の
ブログは日々、スパマーとの激烈な戦い(?)を繰り広げられています。
現在、
様々なコメントスパム対策
が提案されていますが、これ一つで完璧と言える対策がないのが現状です。
ブログ管理者は、これらの方法を上手く組み合わせることで、スパマーへの防御力を高めようとしています。
このエントリでは、コメントスパム対策の 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 属性で独自データを埋め込みます。
ここまでは先の方法と同じなのですが、
送信される値には不正な値を与えておきます。
スパムボットが何も考えずに正直にこの値を送信すると、それはコメント
スパムということになります。
次に
ブラウザでページが開かれた時に、先のフィールドに正しいデータを埋め込み直すための
JavaScript を追加します。
このスクリプトはページの最後にでも追記して必ず実行されるようにします。
また、お客様には
JavaScript を有効にして頂く旨を書いておく方が安全かも知れません。
この例では McCarthy(マッカーシー) 関数という聞いたこともないような計算をしていますが、
とりあえずこの関数は
必ず 91 という結果になります(笑)
従って、本来のお客様は script_auth が enable ではないわけです。
…まぁ、
スパムボットが本腰を入れて対策をしてくるまでは、
この関数はもっと簡単なものでも構わないかもしれません(例えば、1+2+3+4+5...を計算するようなもの)
Step.3 - mt-comment.cgi で拒否する
最後に送信されたデータが正しい値か判定し、
不正な値であった場合はエラーとなるように mt-comment.cgi を修正します。
この部分の処理は先の 3 つのサイトで紹介されている部分を参考に修正します。
寄せられたコメント (最新 5 件を表示しています)
…なんて書いておいて自分が弾かれたらイヤだなぁ…
(;=ω=)ノ ちとテスト