« フィルムをデジカメで撮影してしまえ! スライドデジコピア | トップに戻る | コメント/TBスパムとの戦い - URLキーワードマッチ方式の戦果 » |
2005年10月06日
続々・スパム撃退! せめて再構築地獄を逃れるために 
MovableType 3.2 は 「Spam Fighter」 という
ヤル気満々なコードネームが付いて
いるそうですが、私はまだその威力を試していません。移行作業の手間と、
トラブル発生のリスクを考えると、なかなか実行に移せないのです・・・。
さて、私は今までに以下のような経緯を経てようやく、ブログ運営に支障が
無い程度にスパムを押さえ込めるようになりました。その最後のエントリでは、
■2005/02/08 [スパムコメント対策: URLフィルタを施してみました。]
■2005/03/23 [スパムフィルタのコードをキーワード方式に変更しました。]
■205/06/07 [トラックバックスパムも撃退せよ! MT用スパム対策コード]
■2005/06/11 [トラックバックスパムも撃退せよ! (続報)]
「同じドメインから連続して10個以上のコメント/トラックバックは受け付けない」
という新しいルールを設け、もしキーワードフィルタをすり抜けた場合でも
個数制限でパンクを防ぐ ようなコードを、更に付け加えました。
という記載だけして、その中身のコードは示していなかったのですが、本日、
「そのコードを教えて欲しい」というメイルを
頂戴しました。いや、本当に何の変哲も無い地味なコードなのですが、
念のためここで公開しておきましょう。
(インデントと行間が全角スペースになっていますのでご注意ください)
use FileHandle;
### 色々ファイル開くね
my $blacklist = "(MTインストールdir)/lib/MT/App/antispam.txt"; #キーワード羅列ファイル。
my $fh = FileHandle->new($blacklist) or die "$blacklist: $!";
my $logfile = "(MTインストールdir)/lib/MT/App/antispam.log"; #ログ吐き用のファイル。
my $fhlog = FileHandle->new(">>$logfile") or die "$logfile: $!";
my $lastfile = "(MTインストールdir)/lib/MT/App/antispam_lasturl.log"; #最新URL保持ファイル。
my $last_count = 10; #最新URL保持数
my $last_alert = 9; #スパム判定閾値
my $time_str = localtime(time); #時刻を保持しておくね。
my $tmpurl = $q->param('url'); #これが今回受信したURLね。
### 先に最新URL保持ファイルを更新しておくね。
my $fh_last = FileHandle->new("$lastfile") or die "$lastfile: $!";
my @lasturl = <$fh_last>; #全部(10行)読み込んで
$fh_last->close;
$fh_last = FileHandle->new(">$lastfile") or die "$lastfile: $!";
flock( $fh_last, 2);
print $fh_last $tmpurl. "\n"; #最新のURLと残り9行を書き込んどく。
for ( my $i=0; $i<$last_count-1; $i++ ) { print $fh_last $lasturl[$i]; }
$fh_last->close;
### キーワードマッチ
while ( <$fh> ) {
chomp;
if ( $_ ne "" && $tmpurl =~ /$_/ ) {
print $fhlog $time_str. "\tTRACKBACK SPAM rejected. url=" .tmpurl. "\n"; # ログファイル記録。
return $app->_response(Error=> $app->translate("TRACKBACK SPAM rejected.")); # 拒絶!
}
}
### 同ドメイン連続殺人事件
my $match_count = 0; #マッチした数
### ドメインを抜き出すね
my ( $tmpurl_domain ) = ( $tmpurl =~ /http:\/\/(.*?)(\/|$)/ );
if ( $tmpurl_domain ne "" ) { #ドメインが抜き出せたら
for ( my $i=0; $i<$last_count; $i++ ) { #マッチした数を数えてみよう。
if ( $lasturl[$i] =~ /$tmpurl_domain/ ) { $match_count++; }
}
}
if ( $match_count >= $last_alert ) { #閾値を超えていたら拒絶!
print $fhlog $time_str. "\tTRACKBACK SPAM rejected (full match lasturl). url=" .$tmpurl. "\n";
return $app->handle_error('TRACKBACK SPAM rejected.');
}
### 通りました。おめでとう!
print $fhlog $time_str. "\ttrackback accepted. url=" .$tmpurl. "\n";
こんな風に、最近受けたトラックバックのURLを10件くらいファイルに保持
しておけば、同じURLからの連続送信を感知してブロックすることができます。
これで antispam.txt にセットしていない新顔のURLに襲撃されても、
被害を最小限に食い止め、再構築の嵐から逃れることができるでしょう。
もっとスマートなやり方もあるかと思いますが、まずは応急処置、応急処置(・▽・)ノ
投稿者 CK : 2005年10月06日 23:59 | ブログ
« フィルムをデジカメで撮影してしまえ! スライドデジコピア | トップに戻る | コメント/TBスパムとの戦い - URLキーワードマッチ方式の戦果 » |
▼ はてなブックマークのコメント ▼
▼ コメント ▼
ご自由にコメントください(=゜ω゜)ノ
※管理人は多忙のためお返事はほとんどできません(スミマセン)。スパムおよび本文と無関係なコメントは削除対象になる可能性があります。
▼ トラックバック ▼
このエントリーのトラックバックURL:


