[PHP-users 13219] --enable-force-cgi-redirectを使ったCGIが動かない

Masaki NOHTOMI php-users@php.gr.jp
Wed, 12 Feb 2003 12:28:57 +0900


納富と申します。
#昨日許可されてないアドレスから送りましたが
#入会アドレスにて再送します。

パーミッションや#!/usr/bin/php などの指定なしに
ApacheのSuEXECを使ったオーナ権限で動くPHPの活用を考えています。
それには
http://php.planetmirror.com/manual/ja/security.cgi-bin.php
のケース2のように
--enable-force-cgi-redirect
を使えばよいようなのでトライしてみました。

[環境]
FreeBSD 4.7-STABLE
Apache 1.3.7
PHP 4.3.0
http://homer/cgi-bin/ 以下のファイルのオーナーは www
http://homer/~narf/cgi-bin/ 以下のファイルのオーナーは narf
でApacheのExecCGIディレクティブを使って
スクリプトが該当オーナーで動くのをを確認しています。
(イントラネット環境なので皆さんからは確認不可能で申し訳ありません)

PHPを以下のオプションでコンパイル
../configure \
--with-config-file-path=/usr/local/etc \
--enable-versioning \
--with-regex=system \
--without-gd \
--without-mysql \
--with-gd=/usr/local \
--enable-gd-native-ttf \
--with-freetype-dir=/usr/local \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/local \
--with-zlib \
--with-pdflib=/usr/local \
--with-zlib-dir=/usr \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/local \
--with-tiff-dir=/usr/local \
--with-mysql=/usr/local \
--with-pgsql=/usr/local \
--with-openssl=/usr \
--enable-mbstring \
--prefix=/usr/local \
--enable-cgi \
--enable-force-cgi-redirect
(最後の2行以外はあまり関係ないと思いますが全部のせました)

できあがったCGI用PHPを /usr/bin/php としてコピー
# cp sapi/cgi/php /usr/bin/
またhttpd.confに
AddHandler cgi-script .php
を追加。

そしてwhoami.php というファイル名で

#!/usr/bin/php
<?
system("whoami");
?>

の内容でスクリプトを書き、
パーミッションを700にして
から http://homer/~narf/cgi-bin/whoami.php にアクセスすると予想通り

Security Alert! The PHP CGI cannot be accessed directly. 

This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the
REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive.

For more information as to why this behaviour exists, see the manual page for CGI security.

For more information about changing this behaviour or re-enabling this webserver, consult the installation file that came with this
distribution, or visit the manual page.

というメッセージが現れました。

そこで httpd.confから
AddHandler cgi-script .php を削除し
http://www.php.net/manual/en/security.cgi-bin.php
(上記メッセージのmanual pageの部分がここへのリンクになっている)
に書いてあるとおり

Action php-script /cgi-bin/php
AddHandler php-script .php

を追加。
Action php-script /cgi-bin/php
とはCGI版PHPの本体のことみたいなので
DocumentRoot(私の場合/home/www)以下のcgi-binディレクトリにコピー
# cp sapi/cgi/php /home/www/cgi-bin/php

whomai.php の #!/usr/bin/phpを削除し
パーミッションを 600にして
http://homer/~narf/cgi-bin/whoami.php に再アクセスすると

Warning: Unexpected character in input: '' (ASCII=22) state=1 in /home/www/cgi-bin/php on line 3879

Warning: Unexpected character in input: '' (ASCII=8) state=1 in /home/www/cgi-bin/php on line 3879

Warning: Unexpected character in input: '' (ASCII=27) state=1 in /home/www/cgi-bin/php on line 3879

Parse error: parse error, unexpected T_STRING in /home/www/cgi-bin/php on line 3879

というメッセージがでてきて、スクリプトが動作しませんでした。
cgi-bin ディレクトリにあるとだめなのかと思い
ExecCGIを指定していない
上位ディレクトリにコピーしてやってみても同じでした。

どこか勘違いしてるようなのでご指摘いただけたら幸いです。
よろしくお願いいたします。

-- 
納富正樹 / Masaki NOHTOMI <narf@alcnet.jp>