重複トラックバック防止プラグイン(3.3版)
同一エントリーへの重複トラックバックを抑止するプラグインです。
Movable Type は、バージョン 3.2 まで重複トラックバックに対する制御は行われていませんでしたが、3.3 以降、 重複トラックバック(送信元URL・タイトル・概要が同一のトラックバック)を受信した場合、その内容を過去に受信したトラックバックに上書きするよう、処理が変更されました。
追加された処理は、トラックバック送信後に送信元記事のタイトルあるいはトラックバックの概要を変更してトラックバックを再送信するようなケースを考えた場合、非常に有効です。
現在「重複トラックバック防止プラグイン」を公開しておりますが、上記の理由で 3.3 では重複トラックバック防止プラグインが不要となりました。
ただし、全く同一の内容が再送信された場合ー例えば初回のトラックバック送信がタイムアウトになり(送信が完結しないと Movable Type では「トラックバック送信先のURL」にデータが残ります)、エントリーを再保存(つまり再送信)してしまったケース等ーでも上書き処理が行われ、再構築が発生します。
本プラグインは、内容が全く同一のトラックバックのみをフィルタリングし、再構築を発生させないことを目的としたものです。 *1
1.プラグインのダウンロード
下記の duplicateTBPingThrottlefilter.zip または duplicateTBPingThrottlefilter.lzh をダウンロードしてください。
duplicateTBPingThrottlefilter.zip
duplicateTBPingThrottlefilter.lzh
2.プラグインのアップロード
ダウンロードしたアーカイブを解凍してください。解凍すると中に duplicateTBPingThrottlefilter フォルダがありますので、Movable Type の plugins ディレクトリにフォルダごとアップロードしてください。
アップロード後、管理画面の
メイン・メニュー > システム・メニュー > プラグイン
の画面に利用中のプラグイン一覧が表示されますので、その中に「Duplicate Trackback Ping Throttle Filter Plugin ?」が表示されていればOKです。
3.設定
特にありません。2項でプラグインが表示されていれば有効です。
4.ログ
トラックバックがフィルタリングされた場合、ログに
Filter duplicate trackback ping from the following URL:http://?
というメッセージを出力します。
*1:というのは建前で、「過去に作った重複トラック防止バックプラグインを無駄にしたくない」というのが本音。
asciiTBPingfilter プラグイン
ASCII 文字のみのトラックバックをフィルタリングする Movable Type プラグインを作りました。
1.プラグインの概要
Mobavle Type では 3.2 以降、Junk Filter を利用して、スパムとみなされたトラックバックは Junk フォルダに入るようになっています。また誤ってフィルタリングしたトラックバックを探索・公開できるよう、指定した一定期間、保存できる仕組みになっています。
その流れに逆行して、このプラグインはASCII文字のみのトラックバックを受信した場合、Junk フォルダにも入れず、送信元に 403 を返却します。
本プラグインは下記の CommentFilter コールバックのプラグインのアイデアを元に、TBPingThrottleFilter コールバック に移植させて頂いたものです。
blog.bulknews.net:MTBanASCII: コメントSPAM対策を MT3 に移植
上記のプラグインは 3.2 対応の Junk Filter を利用したものも配布されていますので、トラックバックスパムと判断されたものを Junk フォルダに入れる場合は、下記のプラグインをご利用になることをお勧めします。
blog.bulknews.net:MT BanASCII 3.2 対応
Junk Filter API では Junk フォルダに入れない方法が存在しないと思い込んで TBPingThrottleFilter コールバックを利用しましたが、勘違いでしたらご指摘ください。
2.プラグインを作った理由
概ね下記のような理由です。
- 毎日大量のトラックバックスパムが Junk フォルダに入るが、その中に公開すべきトラックバックが時々紛れており、見つけるのに結構手間がかかる
- サーバの負荷をできるだけ軽減したい
1.の補足として、頻繁に迷惑トラックバックリストをチェックする訳ではないので、削除日数をやや長めにしており、それが逆にトラックバックスパムを山積みにする原因を引き起こしています。
現在1週間ほど使用していますが、Junk フォルダに入る ASCII 文字のみの迷惑トラックバックは0件。またスパムと誤認識された日本語を含むトラックバックだけが Junk フォルダに入っており、作業効率が格段に向上しました。
3.動作条件
Perl 5.8 以上であることが必要です(Encode.pm を利用するため)。誤って 5.6.x の環境で利用しても処理異常にならないようにしています。
4.ダウンロード・インストール
下記リンクより asciiTBPingfilter.zip または asciiTBPingfilter.lzh をダウンロードし、アーカイブを解凍してください。
asciiTBPingfilter.zip(MT4.x用)
asciiTBPingfilter.lzh(MT4.x用)
asciiTBPingfilter.zip(MT3.x用)
asciiTBPingfilter.lzh(MT3.x用)
解凍すると中に asciiTBPingfilter フォルダがありますので、フォルダごと Movable Type の plugins ディレクトリにアップロードしてください(下記は MT3.x 版の例)。
- MTディレクトリ/plugins/asciiTBPingfilter/asciiTBPingfilter.pl
- MTディレクトリ/plugins/asciiTBPingfilter/tmpl/config.tmpl
MT4 版の場合、ブログ別管理画面の [設定]→[プラグイン] で、ASCII Trackback Ping Filter Plugin 2.x が表示されていればOKです。インストール直後から動作が有効になります。
MT3 版の場合、管理画面のメイン・メニューの「利用可能なプラグインの設定」に「ASCII Trackback Ping Filter Plugin ?」が表示されればOKです。デフォルトではプラグインは無効になっています。有効にするには、ブログ別管理メニューの[設定]→[プラグイン]→[ASCII Trackback Ping Filter Plugin]の右側にある「設定を表示」をクリックして、左に表示されたチェックボックスをチェックし、「変更を保存」をクリックしてください。
5.フィルタリングの状況を把握したい場合
MT4.x 版はプラグイン管理画面より設定できます(下記)。

MT3.x版は、asciiTBPingfilter.pl を任意のエディタで開き、
# logging
our $log = 0;
の "0" を "1" に変更してアップロードすれば、ASCII文字のみのトラックバックを受信した時に
Filter ascii trackback ping. URL:http://hogehoge IP:xxx.xxx.xxx.xxx
という内容がシステムメニューのログに出力されます(ブログ別のログには出力されません)。
ログはプラグインの動作確認用です。スパムによってログが大量に出力される可能性がありますので、確認後はOFFにしてください。
2007.09.14
MT4対応を追加しました。
Quasi-Spam Filter Plugin バージョンアップ
Ogawa::Memoranda さんご提供のスパム対策プラグインが 2005.04.08 付で 0.20 にバージョンアップされておりまして、大変遅くなりましたが本日アップグレードさせて頂きました。バージョンアップに伴いフィルタ対象変更のカスタマイズが楽になりました。またカスタマイズ方法についても配布元で掲載くださっています。ありがとうございました。
ということで、当サイトではスクリプトを下記のようにカスタマイズ致しました。
- プラグイン:Quasi-Spam Filter Plugin - Release 0.20
- 改変内容:下記参照
この変更で前回(コメントスパム対策(その6)・トラックバックスパム対策(その2))までと同様の機能を継承しています。
プラグインは上記リンクよりダウンロードしてください。
改めて説明致しますと、このプラグインは、予め設定した文字列を含むコメント・トラックバックをフィルタリング(エラー返送等)してくれるという仕組みになっています。例えば "hoge" をフィルタ文字としてプラグインに設定しておけば、"hoge" が含まれるコメント・トラックバックは受け付けません。またフィルタ文字とは別に、フィルタリングしたい対象エリアを、コメント・トラックバックそれぞれ個別に設定することができます。さらに受信時のリアクションを選択することができます。
1.フィルタ対象文字列の追加
下記のように青色部分を追加します。
# Set your spam pattern
$COMMENT_PATTERN = 'char1|char2|…|charn|<h1>|<a\s'; # H1 or A elements
$TBPING_PATTERN = 'char1|char2|…|charn|<h1>|<a\s'; # H1 or A elements
char1 ? charn は任意のフィルタ文字列を設定します。文字列を複数配置する場合はサンプルのように "|" で区切ります。コメントでリンクを受け付けたい場合は、$COMMENT_PATTERN の "<a\s"(とその前の "|" )は削除してください。
2.フィルタ対象フォームエリアの追加
デフォルトでのフィルタ対象となるフォームエリアは、「コメントの内容」および「トラックバックの概要(=本文の先頭n文字)」となっていますので、「コメント投稿者」および「トラックバックタイトル」を追加するサンプルを記します。
use MT::Comment;
use MT::TBPing;
sub is_comment_spam {
my $comment = shift;
return ($comment->text =~ /$COMMENT_PATTERN/i ||
$comment->author =~ /$COMMENT_PATTERN/i);
}
sub is_tbping_spam {
my $tbping = shift;
return ($tbping->excerpt =~ /$TBPING_PATTERN/i ||
$tbping->title =~ /$TBPING_PATTERN/i);
}
今回のバージョンアップで他のエリアについても簡単に設定できるようにしてくださっているので、「全部入り(ラーメンか)」を希望される場合は下記のように設定すればOKです。
sub is_comment_spam {
my $comment = shift;
return ($comment->text =~ /$COMMENT_PATTERN/i ||
$comment->author =~ /$COMMENT_PATTERN/i ||
$comment->email =~ /$COMMENT_PATTERN/i ||
$comment->url =~ /$COMMENT_PATTERN/i ||
$comment->ip =~ /$COMMENT_PATTERN/i);
}
sub is_tbping_spam {
my $tbping = shift;
return ($tbping->excerpt =~ /$TBPING_PATTERN/i ||
$tbping->title =~ /$TBPING_PATTERN/i ||
$tbping->source_url =~ /$TBPING_PATTERN/i ||
$tbping->blog_name =~ /$TBPING_PATTERN/i ||
$tbping->ip =~ /$TBPING_PATTERN/i);
}
なお上に設定したものから順番にチェックし、文字列がマッチした時点で処理が終わる(=残りは実行されない)ので、優先度の高いものから並べると良いでしょう。
3.コメントスパム受信時のリアクション変更
ここでは正常に受け付けたように見せかける設定にしています。
# Choose a method for rejecting Spam Comments from:
# 'CommentFilter', 'CommentThrottleFilter', 'CommentError',
# 'CommentLongError', 'CommentRedirect', 'CommentEvilRedirect'
$COMMENT_METHOD = 'CommentErrorCommentFilter';
4.トラックバックスパム受信時のリアクション変更
こちらも同様です。
# Choose a method for rejecting Spam Pings from:
# 'TBPingFilter', 'TBPingThrottleFilter', 'TBPingError'
$TBPING_METHOD = 'TBPingErrorTBPingFilter';
トラックバックスパム対策(その2)
Ogawa::Memoranda さんご提供のスパム対策プラグインに対し、下記の改変を行いました。
- プラグイン:Quasi-Spam Filter Plugin 改変内容:トラックバックのタイトル文字列をフィルタ対象に加える
事後になってしまいましたが改変についてOgawaさんご本人の許諾を頂けましたので、引き続き本エントリーにて公開したいと思います(経緯の詳細等は追記をご覧ください)。
以下、元の記事です。
オリジナルのプラグインは、トラックバックについては概要(excerpt)のみがフィルタ対象となっています。ということで、タイトル(title)にはフィルタ文字列が存在するのですが本文にフィルタ文字列が含まれないトラックバックスパムが到来しました。
本文に含まれる文字列をフィルタ対象にするという手もありますが、本文に特異な文字列が存在していないこととタイトル部分もフィルタ対象に含めた方が効率良さそうなので、quasi-spamfilter.pl を下記の通り修正しました。
sub tbping_filter {
my ($eh, $app, $ping) = @_;
return !is_tbping_spam($ping->excerpt);
return !(is_tbping_spam($ping->excerpt) | is_tbping_spam($ping->title));
}
sub tbping_throttle_filter {
my ($eh, $app, $tb) = @_;
my $q = $app->{query};
return !is_tbping_spam($q->param('excerpt'));
return !(is_tbping_spam($q->param('excerpt')) | is_tbping_spam($q->param('title')));
}
sub tbping_error {
my $app = shift;
my $q = $app->{query};
my $mode = $q->param('__mode') || $app->{default_mode};
return if $mode ne 'ping';
if (is_tbping_spam($q->param('excerpt'))) {
if (is_tbping_spam($q->param('excerpt')) || is_tbping_spam($q->param('title'))) {
$app->add_methods('ping' => sub { });
$app->_response(Error => 'Spam TBPing!', Code => 403);
}
}
動作は一応確認しておりますが適用に際しましては個人の責任で行ってくださいますよう、よろしくお願い致します。なお本改変に対する改善案をOgawaさん本人より頂きいておりますので、興味のある方は該当記事のコメント欄をご覧になってください。
2005.02.17 追記
本改変について「(CCLの条件から外れた形で許諾なしに)改変を掲載しているのはまずいのではないか?」というトラックバックを頂きまして、確かにご指摘の通りでしたので著作権者のOgawaさんにお詫びと許諾の旨、ご連絡致しました。
頂いた回答を引用させて頂きますと「Quasi-Spam Filter Plugin はブログ本体とは異なり、Artistic License に基づいて配布しています」とのことで、
- Quasi-Spam Filter Pluginに基づいていること
- 改変内容の明記
を条件に許諾いただきました。これを受けて記事を若干修正致しました。
なお無断で改変を行っていたことは事実ですので、このような記事を投稿しましたこと、謹んでお詫び申し上げます。
トラックバックスパム対策(その1)
数日前に発生した突然のトラックバックスパムは色々なサイトに送信されていたみたいですね。ご近所のサイトをみたところ
より
がありました。
個人的には先日より利用させて頂いているコメントスパム対策が活用できるのではないか?と考えてましたが、考えるだけです(笑)。と思っていたところ、
がバージョンアップされてまして、トラックバックスパムにも対応するようになっていました。
ということでこちらを利用させて頂くことに。
前回との差分は、
# Set your spam pattern
our $COMMENT_PATTERN = '<h1>|<a\s'; # H1 or A elements
our $TBPING_PATTERN = '<h1>|<a\s'; # H1 or A elements
と、トラックバック用の変数が追加されています。赤字の部分を
our $TBPING_PATTERN = 'hoge1|hoge2|hoge3';
とし、最近受けたトラックバックに含まれる一部の文字列に変更しています。
