くれすのPerl日記 このページをアンテナに追加 RSSフィード

この日記の方針。

  1. この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
  2. ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
  3. 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
  4. perl -e die

2007-02-12 (Mon)作ってみたの。。。

[] spamかどうかを判別するやつ。 10:48  spamかどうかを判別するやつ。 - くれすのPerl日記 を含むブックマーク はてなブックマーク -  spamかどうかを判別するやつ。 - くれすのPerl日記  spamかどうかを判別するやつ。 - くれすのPerl日記 のブックマークコメント

作ってみた。投稿者のIP一覧を作ったものの、1個1個nslookupが面倒だったので。RBLサーバの精度を調べるのにも使えるんじゃないかと。

改行区切りでIPアドレスを複数並べたファイルの名前が第一引数、問い合わせるRBLホスト名が第二引数(省略可。省略するとbsb.spamlookup.net)。

以下、長いです。読みたい方はどうぞ。ソースと、実際に使ってみたときの出力。

#!/usr/bin/perl

use strict;
my $DEFAULT_RBL_HOST = 'bsb.spamlookup.net';

my $file = $ARGV[0];
my $RBL_HOST = $ARGV[1] || $DEFAULT_RBL_HOST;
open( IN, $file ) or die 'file not found.';

print "spamlookup server is '$RBL_HOST'\n";
print "reading from $file ...\n";
print "\n";

while( <IN> ) {
    chomp;
    if( /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ ) {
        my $query = "$4.$3.$2.$1.$RBL_HOST";
        my $addr = join( '.', unpack( 'C*', gethostbyname( $query ) ) );
        if( $addr eq '127.0.0.2' ) {
            print "[!] $_ is spam.\n";
        } else {
            print "    $_ is not spam.\n";
        }
    }
}
close( IN );

print "\n";
print "done.\n";

結果はこんな風に出てきます。*1

-bash-2.05b$ perl spamlookup.pl denyhost.txt niku.2ch.net
spamlookup server is 'niku.2ch.net'
reading from denyhost.txt ...

[!] 219.136.239.51 is spam.
[!] 59.0.116.89 is spam.
[!] 218.97.217.34 is spam.
[!] 218.209.52.151 is spam.
[!] 84.253.137.122 is spam.
[!] 202.28.27.3 is spam.
[!] 145.229.150.17 is spam.
[!] 211.143.160.134 is spam.
    64.34.193.106 is not spam.
[!] 61.120.200.163 is spam.
[!] 65.98.62.114 is spam.
[!] 87.234.213.124 is spam.
[!] 87.234.213.124 is spam.

done.
-bash-2.05b$ perl spamlookup.pl denyhost.txt bsb.spamlookup.net
spamlookup server is 'bsb.spamlookup.net'
reading from denyhost.txt ...

[!] 219.136.239.51 is spam.
    59.0.116.89 is not spam.
    218.97.217.34 is not spam.
    218.209.52.151 is not spam.
[!] 84.253.137.122 is spam.
[!] 202.28.27.3 is spam.
    145.229.150.17 is not spam.
[!] 211.143.160.134 is spam.
[!] 64.34.193.106 is spam.
    61.120.200.163 is not spam.
    65.98.62.114 is not spam.
    87.234.213.124 is not spam.
    87.234.213.124 is not spam.

done.

重複するやつを飛ばしてやるともうちょっとスマートかな。

複数のサーバで合わせ技にした方が良いみたい?

余談

このspamIPアドレスはどうやって取っているかって?

PHPなので載せるべきかどうか悩んだものの、一応。悪用厳禁*2

<?php
$fp = fopen( "denyhost.txt", "a" );
if( $fp ) {
  fputs( $fp, $_SERVER["REMOTE_ADDR"]."\n" );
}
fclose( $fp );

header('HTTP/1.1 301 Moved Permanently');
header('Location: http://'.$_SERVER['REMOTE_ADDR']);
?>

わかる人にはわかると思いますが、イヤ~なスクリプトですね。掲示板ファイル名変えて長いこと経つのに、未だにココにアクセスしてくるため、これを代わりに置いてみた。301ヘッダを読ませるとセッション終了してキャッシュも消さないとブラウザ移転先を見ようとする挙動を利用した。

しかし、RBLに問い合わせて全部spamともなると・・・うーん。

*1spamアドレスだし、載せちゃえ。ここにあるのは今日アクセスがあったIPアドレス。いずれもspam

*2:しても自分の掲示板アクセス出来なくなるだけなんだけど。