PDA

View Full Version : phpから作成したphpファイルをブラウザで見られない


md-masu
2006/09/04, 10:56 PM
モジュール版phpで、投稿するとその記事ページ(phpファイル)を作成する
という仕様の「日記」を作っています。

phpから作成したphpファイルをブラウザで見られない現象で困っています。

・write.php (FTPでアップ)
・diaryディレクトリ(FTPでアップ。パーミッション707)
がありまして、
write.phpからdiaryディレクトリにpost_1.php(パーミッション600)を
作成するようにしています。
作成されたpost_1.phpにブラウザでアクセスすると

Warning: Unknown: SAFE MODE Restriction in effect. The script whose gid is ●● is not allowed to access /virtual/■■/public_html/diary/post_1.php owned by uid ●● in Unknown on line 0

Warning: Unknown: SAFE MODE Restriction in effect. The script whose uid is ●● is not allowed to access /virtual/■■/public_html/diary/post_1.php owned by uid ●● in Unknown on line 0

Warning: Unknown: failed to open stream: Success in Unknown on line 0

Warning: Unknown: Failed opening '/virtual/■■/public_html/diary/post_1.php' for inclusion (include_path='.:/usr/local/lib/php') in Unknown on line 0

とエラーが出ます。

safe_mode_gid がONになっていて、
ディレクトリのUIDが「アップした自分」、post_1.phpのUIDが「apache」で異なるから
引っかかっているのでしょうか?
PHPマニュアルの「オープンしようとするファイルの UIDの比較チェックを行います」では
safe_mode_gidについて詳細がよくわかりません。

どなたか、ご解説、解決方法をお願い致します。
※モジュール版PHPでというのが要件となっております。

shimix
2006/09/04, 11:48 PM
作成したphpファイルのパーミッションを604(それでもダメだったら606)にしたらどうなりますか?

#というか、そのくらいは試してますかね・・

md-masu
2006/09/05, 08:16 AM
はい。604にしてもだめでした。
777でも同じなんです。

あと、diaryディレクトリの位置は実際のパスを隠蔽する意図で
public_html/diary/ と書きましたが
実際は
public_html/mytool/diary/ となっています。

階層が何か関係あったりするんでしょうか?
(といっても public_html/diary/ でも試してだめだったんですが)

shimix
2006/09/05, 09:33 AM
うーん、たしかにowner=apacheのままだと動作不可ですね。chownも出来ませんから、他の(owner=IDの)phpからincludeするしか手はなさそうです。

#それだとURLの「見た目」がマズイですかね(汗

loader用のphpファイルの拡張子を省いて(それでphp動作するように.htaccessで設定する)includeするphpファイルをpathinfoで受け取れば見た目のURLはそれっぽくはなります(ブラウザが認識するpathがずれるのでちょっとアンカータグなどには注意しないといけませんが・・)。

md-masu
2006/09/05, 11:10 AM
そうですか。
セーフモードの場合、オープンしようとするファイルの UIDの比較チェックされるが、
ブラウザのUIDと、phpファイルの所有者(UID)が違うから、ブラウザで見れない。
ということでしょうか?

でもphpの実行者はapacheだと思っていたのですが、phpファイルの所有者もapache。
なぜひっかかるのでしょうか?

ブラウザで見る人のUID、phpを実行するapacheのUID、phpファイルのUID。
これらはどのように扱われ、チェックされているのでしょう。

shimix
2006/09/06, 10:58 AM
原因は・・わかりません(汗)。私自身は普段はWinPCのサーバしか手元にないので、あまり深く考えたことがありません。chownの制限は「動作しているスクリプトのowner」が違うのでわかりますが、作成したファイルがphp動作しないのは私としても納得いかない(苦笑)。どなたか説明されているサイトなどをご存知ないですかね。

(蛇足)
回避策ですが、前回書いたような面倒な方法を採るくらいなら、phpファイルを作成する元スクリプトをCGI動作させた方が手っ取り早いですね(こちらはsuExec動作なので何ら問題なかったです)。

md-masu
2006/09/06, 05:46 PM
cgiとして動かすとか、何かしら代替の方法でないと無理なら仕方ないですけど、
どういう原理でそうなるのかはちゃんと知っておきたいですね。
大事なところですから。

誰か詳しい方、管理者の方、是非お願いします。。。

do21
2006/09/07, 09:59 PM
cgiとして動かすとか、何かしら代替の方法でないと無理なら仕方ないですけど、
どういう原理でそうなるのかはちゃんと知っておきたいですね。
大事なところですから。

誰か詳しい方、管理者の方、是非お願いします。。。ファイルの所有者と、そのディレクトリの所有者が異なる場合にエラーが発生する、だったと思います。safe_mode_gid が On なので GID(グループ)によるチェックですけど。

/public_html/writer.php が hoge:hpusers として、それが書き出すファイル /public_html/data.php は apache:apache となります。この場合、/public_html は hoge:hpusers なので apache != hpusers より、Safe mode のエラーが発生と考えられます。

http://jp.php.net/manual/ja/features.safe-mode.phpセーフモードがonの場合、PHPは、 現在のスクリプトの所有者がファイル関数により処理されているファイルまたはディレクトリ の所有者に一致するかどうかを調べます。たぶん、起動時にも同様のチェックが行われるのではないでしょうか。

md-masu
2006/09/10, 08:30 AM
オープン時(読み込み時)にもチェックされるんですかぁ。
少し理解が深まった気がします。

ということはまずphpからディレクトリを作成してその中に作成すれば閲覧はできそうですね。

でもwrite.phpがhoge:hpuserなので
apache所有のDirには書き込みとか出来なくなる予感が。

この辺を確認してみます。

もしだめならwrite.phpだけcgiとして動かすとか、検討します。

ありがとうございました。

exists
2006/09/22, 03:49 PM
safe_mode_gid がONになっていて、
ディレクトリのUIDが「アップした自分」、post_1.phpのUIDが「apache」で異なるから
引っかかっているのでしょうか?
PHPマニュアルの「オープンしようとするファイルの UIDの比較チェックを行います」では
safe_mode_gidについて詳細がよくわかりません。

どなたか、ご解説、解決方法をお願い致します。
※モジュール版PHPでというのが要件となっております。

質問中に目に付いたので、、、。

解説できるほど詳しくありませんが、


XREAの管理メニューにログインして、ツールから、所有者の変更を行ってみてください。