Qitailangのブログ

Webデザイン、碁、Esperanto、自然農法的家庭菜園

単純でも効果抜群のスパム撃退法

2015/04/30追記 この方法は必ずしも安全ではないように思われてきました。しかし実質的に私はこの方法を講じてから被害を受けていないので、少なくとも何も対処しないよりは次善の策を講じるということでお読み下さい。

JavaScriptでもメールアドレスが破られるという例:
http://mailrobo.7jp.net/mrobo3.html

簡単にできるロボットスパム対策

掲示板、ブログ、メールフォームなどを設置したものの怒濤のスパム投稿に閉口して、閉鎖したとかコメントを受け付けないようにしている人は結構いるのではないでしょうか。私は古い良き時代の掲示板がスパムによって閉鎖あるいはスラム化したまま放置されているのを見ると寂しく残念に思います。

スクリプトやテンプレートを2~3行書き換えるだけの簡単な改造でほとんどのスパムを弾けてしまう方法があります。それはロボットはJavaScriptの中身まで解釈できないという弱点を突く方法です。

自分のサイトのブログや掲示板もこの対策を採っており、例えばブログではこれだけのスパムが来ていますが被害はありません。

HTMLのフォームに関する知識があり、簡単なJavaScriptを書けさえすればだれにでもできる対策なのでお勧めです。ただしこの方法は、ロボットによる自動投稿に対する対策であって、人為的ないやがらせ投稿へは対処できません。

スパム撃退の理屈

通常、投稿ページのフォームはこんな感じになっています。

<form action="index.cgi" method="post">
 <input type="hidden" name="mode" value="comment" />
 <input type="hidden" name="work" value="regist" />
 <input type="text" name="name" size="30" value="" />
 <textarea name="text" cols="50" rows="10"></textarea>
 <input type="submit" name="send" value="投稿する" />
</form>

index.cgi は一例ですが、掲示板やブログ、メールフォームなどの投稿時の本来の url とします。~.phpの場合もあるでしょう。これを下のように書き換えておきます。

<form name="reg" action="regist.html" method="post"> 
 <input type="hidden" name="mode" value="comment" />
 <input type="hidden" name="work" value="regist" />
 <input type="text" name="name" size="30" value="" />
 <textarea name="text" cols="50" rows="10"></textarea>
 <input type="submit" name="send" value="投稿する" />
</form>

form に name 属性を付け加えておきます。id 属性でもかまいません。そしてaction属性の値をダミーのurl書き換えておきます。ダミーのurlをregist.html とそれっぽいものにしましたが、意味があるのかどうか(^^ 何でもよいと思います。

regist.htmlは、「JavaScriptを有効にしてください」と表示する、あるいは皮肉をこめて「投稿ありがとうございました」とだけ表示する HTML を用意しておきます。

ロボットは、フォームを機械的に解析して投稿しようとするでしょうが、実際には、regist.html、つまりダミーの url にアクセスするので、投稿には失敗してしまいます。

しかしこれだけでは、本当に投稿したい人もできなくなります。そこでHTMLの最後の方に下のようなJavaScript文を書いておきます。

<script type = "text/javascript">
 document.reg.action="index,cgi";//regというnameで指定されるフォームのaction属性の値を書き換える
</script>

これでフォームの action 属性を最初に示した本来の url 書き換えます。ですから JavaScript を有効にしたブラウザからなら正しい url にアクセスし無事投稿できるというわけです。JavaScriptを使ったこのトリックを解決しないかぎりロボットは投稿に失敗すると思われます。

id 属性を使って書き換える場合は以下のような記述になります。

<script type = "text/javascript">
 document.getElementById("reg").action="index.cgi";//regというidで指定されるフォームのaction属性の値を書き換える
</script>

書き換え用のJavaScriptは外部ファイルとして、読み込むように記述した方が安全かもしれません。

簡易IPアドレス収集スクリプトを使う

フォームのaction属性を任意のダミーurlにするだけでもよいのですが、IPアドレス収集スクリプトを使うと、どれぐらいスパムロボットを引っ掛けて撃退できているのか分かり、少し溜飲を下げることができるかもしれません。

<form name="reg" action="regist.cgi" method="post"> 
 <input type="hidden" name="mode" value="comment" />
 <input type="hidden" name="work" value="regist" />
 <input type="text" name="name" size="30" value="" />
 <textarea name="text" cols="50" rows="10"></textarea>
 <input type="submit" name="send" value="投稿する" />
</form>

regist.cgiはいかにもなcgi名ですが、実は投稿時の処理が書いてあるのではなく単にIPアドレス収集ためだけのcgiです。

簡易IPアドレス収集スクリプト

  1. regist.cgiを実行権限、acclog.dat(空ファイル)を読み書き権限でサーバーにアップロードします。
  2. 掲示板、ブログ、メールフォームなどのフォームを上のように書き換えておきます。
  3. 設置できたら、試しにブラウザの JavaScript を無効にして投稿してみます。「JavaScriptを有効にしてください。」と表示されれば正しく稼働しているとみなせます。
  4. accview.cgiを使うと改ページ処理付きでログを一覧できます。

regist.cgi
accview.cgi
文字コードShift_JIS