« niftyの瞬!ワードがアレゲなRSSで配信開始 | メイン | 幽遊白書完全版 »

Trackback の脆弱性用パッチ

blog.bulknews.netさんがTrackback の脆弱性についての勧告を出している。
TrackBack Pingを JavaScript を使用して送ることができるので、それがSPAMやDDoSとして使われることがあると、いうことらしい。

Movable TypeのVersion 2.661のPatchが上記サイトになかったので書いてみた。

--- lib/MT/App/Trackback.pm.old	Fri Jun 18 22:23:00 2004
+++ lib/MT/App/Trackback.pm	Fri Aug  6 18:43:59 2004
@@ -112,6 +112,17 @@
 sub ping {
     my $app = shift;
     my $q = $app->{query};
+	
+	if($ENV{MOD_PERL}){
+		if($q->headers_in->{'Referer'} or ($q->headers_in->{'User-Agent'} || '') =~ m!^Mozilla/!){
+			return $app->_response(Error => "Trackback ping with invalid headers: denied.");
+		}
+	}else{
+		if($q->referer or ($q->user_agent || '') =~ m!^Mozilla/!){
+			return $app->_response(Error => "Trackback ping with invalid headers: denied.");
+		}
+	}
+	
     my($tb_id, $pass) = $app->_get_params;
     return $app->_response(Error =>
            $app->translate("Need a TrackBack ID (tb_id)."))


と、これを作っていたら、k-MTさんに先こされた(笑
しかも、get_headerメソッドを書いてしまうこのやり方の方がスマートでした。

このPatchをつくるのに、Apache拡張ガイド〈上〉サーバサイドプログラミングApache拡張ガイド〈下〉APIリファレンスを引っぱりだしてしまいました。

でも、CGI(または動的生成コンテンツ)である以上、ユーザ1人がEnterキー→BackSpaceキー→Enterキーでフォームの登録をすればサーバは死んでしまうのですね。昔、運営しているサイトでしばしばありました。
このときは、サイトの性格上のものであったので、ルールを変えることで、連続したフォームの書き込みをする意味をなくしました。
TrackBackではそういうことではないので、Apache側での簡単な防御策があれば良いのですが。

SPAMのブロックにはもちろんなると思います。