今年から始まる新しいサマータイムが近づくにつれ、このサイトのサマータイムエントリに来てくれる人が多くなった。
なかでも、「2007年にサマータイム延長、プチ2000年問題が予想される」というエントリに来てくれる人が多かったが、もっと今年の事情とかを知ってもらおうと、この前書いた「2007年のサマータイムは3/11から」というエントリへのトラックバックをしてみたら何度やっても失敗する。
サーバの問題かと思ったが、ログを見ると
HTTP error: 403 Throttled
という見慣れないエラーメッセージが残っていた。
このメッセージをそのままググってみたらどうやら MovableType についているトラックバックスパム対策が別の問題をひきおこしていた模様。
MovableType にはトラックバックスパムのため、短期間に一定数以上のトラックバックを受けるとトラックバックの受付を一時停止するという機能が実装されていた。 いくつ受けたら止めるかは OneHourMaxPings , OneDayMaxPings という設定を mt-config.cgi に書くことでコントロールできるのだが、初期値が OneHourMaxPings が 10、 OneDayMaxPings が 50なため、1時間で10個、もしくは1日で50個以上のトラックバックは受けつけなくなっていた。
最近はトラックバックスパムがひどく50個なんてすぐ達してしまう。 それが原因で 403 Throttled というエラーが出てトラックバックを受けつけてくれなくなっていたのだった。
対策としては、OneHourMaxPings、OneDayMaxPings の数値を増やすというのがあるが、それでは迷惑トラックバックばかりが増えてあまりうれしくないし、サーバにも負担が増えることになる。
そのため ここギコ!: MovableType 3.2、MT::App::Trackback.pmの修正 にまとめられていた、 lib/MT/App/Trackback.pm を修正し、チェックを厳しくするという方針をとりいれてみた。
「ここギコ!」さんでは送信元のIPアドレスを条件に追加していたが、うちで数日試してみたところ、トラックバックスパムのはいつも違ったIPアドレスからトラックバックを打ってくるのであまり効果が上がらなかった。
ウチにくるトラックバックスパムはサイト名が常に同じだったため、サイト名が同じところからは短い期間のトラックバックははじくという風に変えた。 合わせて、OneHourMaxPings の値を 3 OneDayMaxPings を 10 と少なくした。
普通トラックバックなんて同じサイトからそんなに打ってくるものじゃないので、1時間に2つ、1日9個もあればこれで十分だろう。
ただ、これでもデータベースに格納されるトラックバックスパムの数がちょっと減るだけで、根本的な解決にはならない。 コメントに関しては、以前書いた JavaScript を使った回避方法でほとんどスパムが来なくなったが、トラックバックスパムに関しては今以上の仕組みを考えないと解決しなさそうだ。
変更点はこちら。 $app->param() を使って、トラックバック情報にアクセスすることで、どこから送られてきたか判断できる。 トラックバックのときは blog_name (ブログ名)以外にも title (タイトル)、url (リンク), excerpt (概要) の情報を取ってこられる。 この部分を自分のところに来るトラックバックスパムの特徴に応じて変えたり、追加してもいいかもしれない。
*** Trackback.pm.orig 2005-10-12 00:40:13.000000000 +0900
--- Trackback.pm 2005-10-12 00:45:46.000000000 +0900
***************
*** 126,131 ****
--- 128,134 ----
require MT::TBPing;
if ($app->config('OneHourMaxPings')
< = MT::TBPing->count({ blog_id => $tb->blog_id,
+ blog_name => $app->param('blog_name'),
created_on => [$from] },
{range => {created_on => 1} }))
{
***************
*** 137,142 ****
--- 140,146 ----
$from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
my $count = MT::TBPing->count({ blog_id => $tb->blog_id,
+ blog_name => $app->param('blog_name'),
created_on => [$from] },
{range => {created_on => 1} });
if ($count >= $app->config('OneDayMaxPings')) {
参考リンク:
Movable Type の HTTP error: 403 Throttled に関するまとめ
MovableType 3.2、MT::App::Trackback.pmの修正
Comments