ついにspam対策

何とコメントspamが72件も来ていたので、ついにコメントspam対策に乗り出すことにした。

コメントについてはhttp://blog.bulknews.net/mt/archives/001508.htmlの(o)さんのコメントのリンクからhttp://as-is.net/blog/archives/000902.htmlにあったspamfilter.plを改造・・しようとしたがどうもうまくいかなかったので、同じhttp://as-is.net/blog/archives/000962.htmlのQuasi-Spam Filter Pluginをちょっと弄って(といってもフィルタリング文字列を変えたぐらいだが)導入。トラックバックについては:http://blog.bulknews.net/mt/archives/001544.htmlのTBPingDSBLを導入。早速このエントリにコメントとTBのspamを送ってテストしよう。あと、この対策に伴ってコメントの認証制を解除。普通のコメントについてはより制限が緩くなったはずです。

追記:TBPingDSBLがどうも誤動作するのでNet::DNSを入れてみたが変わらず。よく調べてみると、私の環境ではメールサーバ(EMWAC IMS)を運用するためにプライマリDNSサフィックスにsephiebrain.jpをセットしてあるため、存在しない名前で検索しても(例えばnonexistdomain.go.orzとか)ヒットしてしまう(勝手にnonexistdomain.go.orz.sephiebrain.jpに変えて問い合わせを行うため)ことが判明。そのためNet::DNSの使用を断念し(一旦インストールしてしまったのでTBPingDSBLのif文をif(1==2)のように書き換えて必ず偽になるようにした)、nslookupでオプション(「-domain=.」とでもしておけばよい。なぜか「-domain=」ではだめだった)を指定することによってなんとか正常に検索できるようになったのだが、今度は判定部分のNon-existent domainという出力を拾うことができない。どうやら私の環境では標準出力だけ拾って標準エラー出力を捨てることがあるらしい(そのため時々前のCGIなどで発生した標準エラー出力がまとめて表示されることがある)。そこでエラー出力を標準出力にリダイレクトすることによってなんとかうまく動作するようになった。変更点は以下の通り。


オリジナル:  if (eval 'require Net::DNS') {
改造後:    if (1 == 2){
オリジナル:  my $opt = $type ? '-ty'.$type : '';
↑の次に追加:$opt = "-domain=. " . $opt;
オリジナル:  my $out = `nslookup -sil $opt $ip`;
改造後:    my $out = `nslookup $opt $ip 2>&1 | more`;
オリジナル:  if ($out && ($out !~ 'NXDOMAIN')) {
改造後:    if ($out && !($out =~ /Non-existent domain/ig)){ 

ところで、まだspamが来ていないからいいが、約定期日記のほうはどうすればいいだろうかね・・。同じような仕組みをコメントCGIとトラックバックCGIに入れるしかなさそうだな。