spam対策実装

あれからさらに2、3のspamコメントがきてたので、思い切って掲示板に導入したspam対策をこっちにもいれてみることにした。

大抵のspamコメントはコメント中のタグ使用が可能か、そうでなければ自動ハイパーリンクされるであろうことを狙ってコメントに「http://~」や「<a href="http://~」というURL文字列を含んでいる。
aタグリンクについては以前から蹴るようにしてあったし、そもそもタグ使用を許可してないので意味がないのだが、http://については私自身もURLを含んだコメントをするため全面禁止にすると辛いので悩んでいたが、今回掲示板に導入した方法であるリンクの特殊タグ化を行った。

リンクの特殊タグ化というのは、http://という文字列を含むことを禁止する代わりに、[[http;www.google.co.jp/;Google 日本]]のように書けばGoogle 日本のようなリンクになるというものである。これはMT標準のオートリンクを少し弄ることで実現する。

まず、MTのオートリンクはMTのディレクトリ以下のlib/MT/Util.pmにあるmunge_commentというところで行っている。
そこで、もともとあるオートリンクの下に、特殊タグによるリンク機能を追加すればOKだ。

sub munge_comment {
my($text, $blog) = @_;
unless ($blog->allow_comment_html) {
$text = remove_html($text);
if ($blog->autolink_urls) {
$text =~ s!(http://\S+)!<a href="$1" target="_blank">$1</a>!g;
$text =~ s!\[\[(.*?);(.*?);(.*?)\]\]!<a href="$1://$2" target="_blank">$3</a>!g;#追加する箇所
}
}
$text;
}
一部のCGIなどでデリミタ(区切り)としてセミコロンが使われるので問題がないわけではないが、しばらくこれで様子を見ることにする。
しかし、元々コメントの少ないこのblogのことなので、問題があっても発覚するのがかなり後になるかもしれない。

追記(2007/6/17 22:13):
タグを&lt;や&gt;にするのを忘れていた。修正。