movabletypeの最近のブログ記事

メール通知を有効にしていると、誰にでもメールが送れてしまうという脆弱性。多分ここが初出だと思う。メール通知をOFFってやり過ごそうと思っていたら、本家にアナウンスとパッチが出ていた。プラグインでMTのライブラリを置き換える方法が、パッチのコードを見て良く理解できた。

大馬鹿野郎のスクリプトのせいでTrackbackがクローズどころか、無効になってしまっていた。もはや管理画面で操作できる量ではなくなっていたので、SQLを叩いて復旧した。orz

$mysql -u (userid) -p (password)
mysql> use (database name);
mysql> update mt_trackback set trackback_is_disabled = 0;
mysql> update mt_entry set entry_allow_pings = 1;
mysql> commit;
mysql> exit;

実は今年に入ってからコソーリこのサーバを11月下旬に借り始めたVPSに引っ越している。SMTPサーバとしてPostfixを選択しているが、面白い設定があったので導入してみた。DNSを利用したオープンリレーサーバ等のブラックリストチェックだ。スパム配信に使われやすいサーバが登録されている。

/etc/postfix/main.cf(抜粋)

smtpd_recipient_restrictions =
    permit_mynetworks, permit_sasl_authenticated,
    reject_rbl_client spamcop.net,
    reject_rbl_client dynablock.wirehub.net,
    reject_rbl_client opm.blitzed.org,
    reject_rbl_client relays.ordb.org,
    reject_rbl_client sbl-xbl.spamhaus.org,
    reject_rbl_client all.rbl.jp,
    reject_rbl_client list.dsbl.org,
    reject_rbl_client cn-kr.blackholes.us,
    reject_rbl_client brazil.blackholes.us,
    reject_rbl_client russia.blackholes.us,
    permit_auth_destination,
    reject

私のサーバにはまともなメールは一日に多い日で100数十通程度しかこない。はっきり言って使っているブラックリストが多すぎるが、トラフィックが少ないことと、同じサーバでBINDをキャッシュサーバとしても動かしているので許して欲しい。

reject_rbl_clientで並んでいる下の三つは過激だ。中国や韓国、ブラジル、ロシア(スパム多発国)に割り当てられているIPアドレスを持つメールサーバからの配信を全て拒否してしまう。

これを導入してからスパムが激減した。導入前はMUA側のベイジアンフィルターで自動的にごみ箱逝きにするしかなかったのだが、このブラックリストを通過してくるスパムは一日一通から二通の状況が続いている。Postfixを自前で動かしていてスパムに悩まされている方は試してみて欲しい。

同じ原理を応用したMovabletype用のプラグインであるMT-DSBLも導入してみた。その名のとおり、DSBLのみを参照している。ここ数週間はコメントスパムが来ないので、楽しみにして待つことにしたい。

他所から引用して言及する場合にBookmarklet(MT It!やQuick Post)をずっと利用してきた。V3.0でも使いたいので、2.6xと同様のHackをしてみた。早速このエントリで使っているが、良さげな感じだ。

CMS.pmの887行目を変更(V3.01D-ja)

old: $param{text} = sprintf qq(<a title="%s" href="%s">%s</a>\n\n%s),
new: $param{text} = sprintf qq(<blockquote><div class="quotetitle"><a title="%s" href="%s">%s</a></div>%s</blockquote>),

下のリンク先にあるように、blockquoteをclassでやっている方は、「<div class="blockquote"></div>」で括るように修正して欲しい。

【重要】MTテンプレートは2004/8現在、MT3.0には対応しておりません

Blog HacksのHack #62「古いエントリのコメントを一括クローズする」を元ネタにトラックバック版を作って、両方とも鯖に仕込んだ。これで管理画面からシコシコ設定する必要が無くなる。先月はアホみたいに30エントリ以上投稿しているので、この作業を自動化しようとしていた矢先のHack本の到着、感謝しまくりだ。

投稿から30日でコメントをクローズ、120日でトラックバックもクローズするように設定した。

Blog Hacksのサポートサイトでも掲載されているソースを入手できる。

トラックバック版の差分

2c2
< # MT Perl API を使って古いエントリのコメントをクローズする
---
> # MT Perl API を使って古いエントリのトラックバックをクローズする
33c33
<     allow_comments => 1, 
---
>     allow_pings => 1, 
40c40
< my $count_comment_closed = 0;
---
> my $count_trackback_closed = 0;
42c42
<     $entry->allow_comments(2);	# コメントをクローズ
---
>     $entry->allow_pings(0);	# トラックバックをクローズ
47c47
<     $count_comment_closed++;
---
>     $count_trackback_closed++;
52,53c52,53
<     if ($count_comment_closed > 0);
< print "$count_comment_closed comment(s) closed\n";
---
>     if ($count_trackback_closed > 0);
> print "$count_trackback_closed trackback(s) closed\n";

小粋空間さんのテンプレートに感動して早速このサイトに導入してみた。【ありがとうございます!】

アーカイブも3カラムなので、ここで私なりに汗をかいてみた。やった事は

  1. 各パーツのテンプレートモジュール化とファインチューン
  2. 左右ブロック用インデックステンプレート作成
  3. 全てのテンプレートで左右ブロックを↑からincludeするように修正
  4. .htaccessにHandler追加(htmlでもssi処理をするように指定。危険!)

例えば、カレンダーを全てのアーカイブの左ブロックで表示するとすると、新規のエントリやコメント、トラックバックがある度に再構築しないと、古い情報が表示されてしまう。技術的には、前述のイベント発生時に自動的に再構築をかけられるのであるが、共用サーバでは褒められる作法ではない。

となると、PHPかSSIで最新インデックスを取り込むしかない。SSIを使用する様に変更し、読者が見るときに最新の左右ブロック(インデックステンプレートで生成されるので常に最新)をincludeするようにしてみた。テストしたところ、アーカイブページでも最新のコメントが表示されているようである。良し。

先日の携帯対応のトラフィック引き込みは、このブログのメインインデックスからは出来なくなってしまった。メインインデックスでのincludeをスクリプト側でやればいいだけなので、備忘録として残しておきたい。

htmlにserver-parsedをAddHandlerしてしまったので、将来気が変わってコメントにHTMLタグの使用を許可した場合、XSSのリスクに晒される可能性がある。タグを許可した場合に、Movabletypeがどの程度のSanitizeをするのかもチェックしておきたいところだ。(備忘録)

現在使用している Movable Type 3カラムテンプレートです。左右サイズ固定、中央サイズ可変でWindows2000/XP IE6.0/NC7.1の環境では今のところ不具合出ていません。基本的には「すちゃらかCSS素材集」のテンプレートを流用しています。

このサイトのカレンダーを復活させて(結構励みになる)、POSTした日に印をつけるようにした。デフォルトではPOSTがある日(MTCalendarIfEntries)にはDaily Archiveへのアンカーが付けられる。このブログではDaily Archiveを作成していない--これのレンダリングが一番時間がかかる--ので、404になってしまう。

解決策として、

  1. Monthly Archiveにリンクする
  2. アンカーを外す
を思いつき、順次試行錯誤してみた。

今は9月なので、9月の月別Archiveをごにょごにょしたい場合は"<MTArchiveList archive_type="Monthly" lastn="1">"と書けばいい。ならば、8月は"<MTArchiveList archive_type="Monthly" lastn="1" offset="1">"と書けるのかと思ったが、そうは行かないようだ。マニュアルにもMTArchiveListのところにはoffsetが使えるとは書いていない。これはショックが大きかった。

代替策として、phpスクリプトを埋め込んで解決した例を見つけたが、phpはあまり好きではないので諦める事にした。phpに躊躇しない方は試してみて欲しい。

本家のサポートフォーラムに要望が上がっているようなので、そのうち標準タグでサポートされるかも知れない。要望があがっているのが2年以上前と言うのがアレだが。

コードをエントリに貼り付ける際にHTMLデコードをしないと、色々と問題が発生する。Movabletypeのエントリ投稿(編集)画面にデコードボタンを追加するHackを作られた方がいた。早速導入させて頂く事にした。"<>&<>"←こういう事が簡単に出来る。いちいちローカルでフィルタ処理しなくていいので大変楽だ。

ありがとうございます!

PC Blog @ Noel Cafe: Decodeボタンをつける。

タグとかの引用をかなーり使うので、
デコードボタンも作ろうと思います。

MT4i導入(3)

|

Treo 600のBlazerでHTTPヘッダのLocationレスポンスヘッダフィールドが効かないというのは私の勘違い(SSIでexecしたのが間違い)だった。当該スクリプトをインデックスファイルを生成するCGIスクリプトという位置づけにして、辻褄を合わす。携帯端末からだと、yoshiki.com上の居場所(サブドメイン)に応じてMT4iの対応するBlogに移動する。携帯端末以外の場合は、indexページの内容をそのまま吐き出す。

MovableTypeが生成するメインインデックスページをLocationフィールドに指定すれば、スクリプトの中でダサい事をしなくていいのだが、ブラウザのアドレスバーにファイル名まで出てしまう。メインインデックスページのファイル名は今後も変更する可能性が大なので、アクセスする人にはメインインデックスページのファイル名を意識して欲しくない。ということで、丸呑み丸出しというアホな事をやっている。

MovableType側には一切変更を加えずに、携帯対応ができた。これにて一件落着。

index.cgiの中身

#!/usr/bin/perl
use strict;
use warnings;
my @ua2fwd = (
	qr{DoCoMo},
	qr{J-PHONE},
	qr{UP\.Browser},
	qr{PDXGW},
	qr{DDIPOCKET},
	qr{Palm},
);
my @host2fwd = (
	{ path => 'yoshiki.com',      id => '0' },
	{ path => 'blog.yoshiki.com', id => '2' },
	{ path => 'treo.yoshiki.com', id => '5' },
	{ path => 'pis.yoshiki.com',  id => '4' },
);
my $dest = 'http://mobile.yoshiki.com/?id=';
my $ua   = $ENV{HTTP_USER_AGENT};
my $host = $ENV{HTTP_HOST};
my $flag = 0;
foreach (@ua2fwd) {
	$flag |= $ua =~ $_;
}
if ($flag) {
	my $id2go = '0';
	foreach (@host2fwd) {
		$id2go = $_->{id} if $host =~ $_->{path};
	}
	print "Location: $dest$id2go\n\n";
}
else {
	print "content-type: text/html\n\n";
	open HTML, '< ./index.html';
	while (<HTML>) {
		print;
	}
	close HTML;
}

残作業を片付け、Treoでテストしてみたが、BlazerにはRefreshもLocationも効果が無い様で、挫折しそうな感じである。素直に各メインインデックスにリンクを貼ってお茶を濁す事にする。

UserAgentを見てLocationフィールドを吐く予定だったスクリプト(mobile.pl)

#!/usr/bin/perl
use strict;
use warnings;
my @ua2fwd = (
	qr{DoCoMo},
	qr{J-PHONE},
	qr{UP\.Browser},
	qr{PDXGW},
	qr{DDIPOCKET},
	qr{Palm},
);
my @host2fwd = (
	{ path => 'blog.yoshiki.com', id => '2' },
	{ path => 'treo.yoshiki.com', id => '5' },
	{ path => 'pis.yoshiki.com',  id => '4' },
);
my $dest = 'http://mobile.yoshiki.com/?id=';
my $ua = $ENV{HTTP_USER_AGENT};
my $flag = 0;
foreach (@ua2fwd) {
	$flag |= $ua =~ $_;
}
if ($flag) {
	my $host = $ENV{HTTP_HOST};
	my $id2go = '0';
	foreach (@host2fwd) {
		$id2go = $_->{id} if $host =~ $_->{path};
	}
	print "Location: $dest$id2go\n\n";
}

MT4i改造版の差分(V1.81ベース)

Digital Junk: MT4i導入(1)

残作業

  1. 携帯端末からのトラフィックの自動誘導(Perl CGIとSSIの合わせ技?)
  2. Blog IDチェック強化

このアーカイブについて

このページには、過去に書かれたブログ記事のうちmovabletypeカテゴリに属しているものが含まれています。

前のカテゴリはlinuxです。

次のカテゴリはpchardwareです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01