失敗! MovableType プラグイン内で PHP パイプを使用する

Posted by
ぴろり
Posted at
2006/05/17 02:28
Trackbacks
関連記事 (0)
Comments
コメント (1)
Post Comment
コメントできます
Category
開発メモ カテゴリ

 拡張子が .php のファイルは、リクエスト時に PHP プロセッシングが行われるので問題無いのですが、例えば、MT 標準の検索機能を使った場合など、その出力結果に含まれる PHP コードは処理されません。そこでビルド処理の段階で PHP コードを処理したくてプラグインを書いてみたのですが、動作せずorz
 何も考えずにビルド内容を PHP プロセッサにパイプするだけのプラグインだったのですが、CGI 権限で呼ばれた子プロセスである PHP のセキュリティ警告で動作しませんでした。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

 PHP が、force-cgi-redirectオプション付きでコンパイルされているためで、 シェルスクリプトからは期待した通りの動作になります。CGI として invoke された Perl からのパイプは、CGI の実行権限と同じになってしまうんですね…
 勿体無いので(?)ソースコードを公開しておきます。「動作するようにしてやったぜ!」という神の降臨に激しく期待しています(笑

 さくらインターネットのレンタルサーバで実験

#!/usr/bin/perl
package MT::Plugin::PHPProcess
use strict;
use File::Temp qw( tempfile );
use MT::Template::Context;

;# Register as a plugin
if (MT->can ('add_plugin')) {
	require MT::Plugin;
	my $plugin = MT::Plugin->new;
		$plugin->name (__PACKAGE__);
	MT->add_plugin ($plugin);
}
MT::Template::Context->add_container_tag (PHPProcess => &php_process);

;### MTPHPProcess
sub php_process {
	my ($ctx, $args, $cond) = @_;
;#
	;# build-up contents
	my $builder = $ctx->stash ('builder');
	my $tokens = $ctx->stash ('tokens');
	my $out = $builder->build ($ctx, $tokens, $cond);
	return $ctx->error ($builder->errstr)
			unless defined $out;

	;# save the whole content into a temporal file
	my ($fh, $filename) = tempfile ();
	if ($fh) {
		print $fh $out;
		close $fh;

		;# Process with PHP
		if (open PHP_PROCESS, "php -f $filename |") {
			$out = join '', <PHP_PROCESS>;
			close PHP_PROCESS;
		}
	}
	return $out;
}

1;
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

寄せられたコメント (全 1 件中、最新 5 件まで表示しています)

Posted by
xfunxfun
at
2007/06/05 14:02
ID
mKpPT9ew
debianにてphpinfo()を出力できた経験がありますが、
redhat系では成功しません。
自debianではphpがcliまでインストールされているからかな〜
セキュリティーってphp.iniの
cgi.force_redirectの設定かな?
これをかいくぐっても次にまた関所があるんだが。
なんでdebinでいけたのだろう。

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。