運用している掲示板はCAPTCHA付き。しかし最近少しずつスパムが増えてきました。CAPTCHAは現時点での最も有効な掲示板スパム対策だと思われますが、意味をなさなくなる日も近いのかもしれません。
新たな対策ということで、MT-Keystrokesの実装をコピーしてみました。キーボード押下時に発生するイベントを使えば、IEコンポーネントを使うようなボットをしのげるのではないかと。自分で書こうと思いましたが案の定既に世の中にあった。
ということで内容は以下。MT-Keystrokesの中身そのままです。Perlで書かれていれば基本的にはどのようなタイプのプログラムにも適用できるでしょう。
<script language="JavaScript" type="text/javascript"> <!-- function keystrokes(form) { form.strokes.value = 1; } //--> </script> <input type="hidden" name="strokes" value="0" />
掲示板のコメント投稿ページに上記を追加。
<textarea name="comment" onkeypress="keystrokes(this.form)">
textarea要素に「onkeypress="keystrokes(this.form)"」を追加
<input type="submit" onclick="keystrokes(this.form)">
submitボタンに「 onclick="keystrokes(this.form)"」を追加。
あとは書き込みスクリプト側で、「strokes」パラメータの数値が「0」でないかを確認するようにすればOK。例えばCGI.pm環境だと以下のような感じ。
use CGI; die "error" if $q->param('strokes') < 1;
※実際にはdieで殺す処理はありえないので適当なエラーハンドリングを行います。
スパム書き込みは毎日数件あったのですが、二週間前にこの対策を施したところ現時点まで一件もスパムが来ていません。所詮はJavaScriptなのでいずれ突破されてしまうとは思いますが現時点ではかなり有効であり、かつお手軽な対策です。お試しあれ。
- 参考
- http://rebecca.ac/milano/mt/archives/001649.html
- http://japan.cnet.com/blog/kenn/2008/02/28/entry_25005627/
※上記はかなり単純な処理ですがキー押下時のイベントを捉えるロジックを複雑化すると強力な対策になり得るかもしれません。全角文字数とキーストローク数の相関関係は少なくとも海外のエンジンには判定できない、ような気がする。