DDoS 的な JavaScript のアタックをはじきつつ、blosxom の Ping flavour とかから送信される(正当な?)リファラつき Trackback を確認画面を1枚はさんで受け付けられるようにしてみました。(なんか深追いっぽいですがこれが Blog ツール側のデフォルトになればよいのかも)
mod_rewrite のほうでは以下のように設定。Mozilla はじきはやめて、blog.bulknews.net 以外の Referer をはじくようにして、飛ばし先を Forbidden でなくて /mt/tb-pass.cgi としました。
# for Trackabck SPAM
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} mt-tb\.cgi
RewriteCond %{HTTP_REFERER} .+
RewriteCond %{HTTP_REFERER} !http://blog\.bulknews\.net.*
RewriteRule (.*) /path/to/mt/tb-pass.cgi [L]
tb-pass.cgi では、パラメータを受け取って、確認画面にて再度フォームを表示。blog.bulknews.net のリファラは受け取れるようになっているので、ここで再度 submit すれば Trackback Ping が送信できます。mod_rewrite ではじいたもともとの Ping URI は環境変数 SCRIPT_URI で取得。なんだか無駄に長いですが。。
use strict;
use CGI;
use Jcode;
my $q = CGI->new;
my @params = qw(title blog_name excerpt url charset);
my $ping_url = $ENV{SCRIPT_URI};
if ($ping_url =~ /tb-pass\.cgi/) {
# Direct Access
print $q->header, "Forbidden";
exit;
}
my $charset = $q->param('charset');
$q->param(charset => "utf-8");
for my $p (@params) {
my $v = get_value($q, $p, $charset) or next;
$q->param($p => $v); # set
}
print $q->header('text/html; charset=utf-8'),
"<html><head><title>Trackback Confirmation</title></head>",
"<body>Really send this Ping? (Sorry, this confirmation is for anti-spam)\n",
$q->start_form(-action => $ping_url, -method => "POST");
for my $p (@params) {
defined($q->param($p)) or next;
print $q->hidden(-name => $p);
}
print $q->submit(-value => "OK"), $q->end_form;
sub get_value {
my($q, $p, $charset) = @_;
my $v = $q->param($p);
defined($v) or return;
my $code;
if ($charset) {
my %code = (
"euc-jp" => "euc",
"shift_jis" => "sjis",
"utf-8" => "utf8",
);
$code = $code{lc($charset)};
} else {
$code = Jcode::getcode($v);
}
return Jcode->new($v, $code)->utf8;
}
掲示板に貼られているボタンを押してしまうような人は、もう一回押してしまうかも。。。
Lieber grumble!!! hoffe dir gehts gut da in der fremden weite... wenn man dich schon nicht persnlich besuchen kann...
Wann machma denn die nchste party??? lebe lang und erfolgreich!!! :)