1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

ブログのスパムメッセージを簡単にブロックする方法

2022-02-03 20:32:19

スパムは通称スパムと呼ばれ、ほとんどの人が目にしたことがあると思います。以前WordPressを使っていた時は、アンチスパムのプラグインをインストールしていたので、ほとんどのSpamをブロックできたのですが、先月WordPressから新しいブログプラットフォームに移行してからは、初日にいくつかのSpamに遭遇しましたが、どれも海外のプロモーション広告か何かでした。ブログの訪問者数自体は非常に少ないので、毎日数件のSpamがあれば、あまりにひどいので、手動で削除するのも時間がかかりすぎるし、自分で書いた小さなシステムなので、プラグインのオプションを持つ方法がなく、解決策を見つけるしかないのですが、どうしたらいいでしょうか。

スパムは画像から正しいキャプチャを識別するのが難しいので、この問題を解決するためにキャプチャを追加するサイトをよく見かけますが、普通のコメント投稿者にはいきなり余計なステップなので、これらのスパムをブロックするために他に何があるのでしょうか。

よく考えてみると、通常のメッセージは人間がブラウザーを通じてデータをサーバーに送信しているのに対し、スパムは通常、インターネット上のコメントフォームをスキャンしてフォームのデータを偽造し、そのフォームのアクションを判断してそのアクションにデータをPOSTする固定プログラムであることがわかります。つまり、スパムの送信者は、ブラウザーを通じて私たちのフォームのページを訪れていないため、ページ上のJavaScriptは一切実行されていないことになるのです。

まず、通常のユーザーからは見えない隠しテキストボックスをフォームに設置します。

<div style="margin:0;padding:0;display:inline">
  <input id="checkspam" name="checkspam" type="hidden" value="Hello Ruby" />
</div>



次に、このテキストボックスの値を変更するための小さなJavaScriptのコードを記述します。

jQuery(document).ready(function($) {
  $("#checkspam").val('abcdefg');
});



Spam送信者の場合、JavaScriptは実行されないので、次にサーバー側でhiddenテキストボックスの値を判断し、JavaScriptによって変更されていなければ、そのメッセージは間違いなくSpamです(ブラウザがJavaScriptを無効にしている通常のユーザーを除く)。

Ruby on Railsのアプリケーションの例です。

if params[:checkspam] == "abcdefg"
 @comment.save
else
 # It's a spam...
end



実は、この隠しテキストボックスは、JavaScriptの助けを借りてキャプチャが自動的に入力されることを除けば、キャプチャと同じことをするのです。

この方法を使い始めてから1ヶ月以上経ちますが、もうスパムは来ていません。