blog.鶯梭庵

二〇〇四年 師走 卅日 木曜日

スパムコメント対策

このブログを作るに当たって、blosxom で作られたブログをいくつか見たのだけれど、スパムコメントが結構書き込まれていた。そこで、立ち上げたときにはコメント機能を外していて、コメントが書き込まれたらメールで知らせてくれる機能を追加してからコメントが書き込めるようにしたのだが、すぐにスパムコメントが来た。いったいどこから嗅ぎつけてくるのやら。

はじめは、手動でスパムコメントを消していたが、それを毎日するのも面倒なので、以下の対策をしたところ、スパムコメントがなくなった。


データの読み込みには、CGI モジュールを使っている。

use CGI ':cgi';
$CGI::POST_MAX = 1024 * 4;
my $error = cgi_error;

こうすると、4KB より大きなデータが送られてきたとき、そのデータは捨てられて、$error にエラーメッセージがセットされる。送られてきたデータが空だったとき、$errortrue だったら、データが大きすぎたということだし、$errorfalse であれば、もとから空だったということが分かる。4KB というのは甘い制限のような気もするが、ある程度長い書き込みでも、まともな内容なら受け付けたい。


次に、それぞれの項目について、以下の正規表現にマッチするかどうか調べて、マッチしたら書き込まない。

m{<[a-z/!].*>}is

コメントに HTML タグが含まれていれば、これに引っかかる。HTML じゃなくても引っかかる可能性はあるが、現実的には問題にならないだろう。私のところにあったスパムコメントは、いかがわしいサイトへのリンクを含んだ HTML だったので、これでスパムが止まった。


次に HTML 特殊文字のエスケープ。HTML エンティティの入力は受け付けるようにした。

s/&/&amp;/g;
s/&amp;([a-z]\w+);/&$1;/ig;
s/&amp;(#\d+);/&$1;/g;
s/</&lt;/g;
s/>/&gt;/g;
s/"/&quot;/g;

最後に、改行文字の処理をする。これについては、OHZAKI さんのperlメモに詳しい解説がある。

コメントを書くには JavaScript が必要です。