web-dev-qa-db-ja.com

PHP fopenは常に許可が拒否されて失敗します

いくつかのWordpressブログをAWSに移行している最中ですが、ファイルのアクセス許可に関する問題が発生し、過去2時間で問題が解決しました。

最も単純なfopen呼び出しは常に失敗し、「ストリームのオープンに失敗しました:権限が拒否されました」:

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>

私は以下を試しました/チェックしました

  • 私が書いているディレクトリは正しいファイルパーミッション(755)と正しい所有権を持っています。これは、/ homeまでのパス全体に当てはまります。
  • getcwd()によって確認された正しいディレクトリを書いています
  • テストPHPスクリプトは、書き込みを試みてアクセス許可を修正しようとしているパスと同じ所有権をハッシュします(644)。
  • Mod_suexecを実行して、書き込み先のパスと同じユーザーとグループでスクリプトが実行されるようにします。関数getmyuid()およびgetmygid()は、正しいユーザーおよびグループIDを返します(編集:これは間違っています。以下を参照)。
  • Php.iniでPHPセーフモードが無効になっています。
  • fopenは許可されていないPHP関数ではありません。
  • open_basedirの使用は無効になっています。

これを引き起こしている可能性のある見逃したものはありますか?私はこれをずっとずっと見続けてきたので、明らかな何かを見逃しています。

更新:適用後 wombleの提案 この問題は、不正な権限やPHP設定ミス。上記のコードでファイルを書き出すことはできましたが、PHPスクリプトが正しいユーザーとグループで実行されても、結果のファイルの所有権とグループはApacheの所有権とグループに設定されました。コマンドラインから同じテストスクリプトを実行すると、出力されたファイルに適切な権限が付与されます。これは私がmod_suexecを使用する際の問題であると私に思わせます。

編集:getmyuid()getmygid()スクリプトファイルのユーザーとグループのみが返され、実行時に許可されていないため、これは正しくありません。より正しいアプローチは、次のようなものを使用することです。

<?php echo exec('ps -up '.getmypid()); ?>
8
Kevin Loney

良い質問です-宿題を終えたことを示しています。

確認できなかった「明白な」ことは何も考えられないので、より高度なデバッグアドバイスしか提供できません。

  • PHPプロセスでstraceを起動し、内部で何が行われているかを正確に確認します。
  • fopen(..., 'r')を実行するコードを記述して、ディレクトリツリーのアクセス許可が実際にOKであることをトリプルチェックします。
  • suを問題のユーザーに送信し、コマンドラインでいくつかのことを試してください。それが機能する場合、あなたはknowスクリプトがあなたが思っているアクセス許可で実行されていません。
  • ファイル、ディレクトリ、または先行パスコンポーネントに拡張ACLがないことを確認します(getfaclは使用するツールです)。それは珍しいことですが、時々彼らは跳躍してあなたの顔をはぎ取るでしょう。 ACLがある場合は、setfacl -xを使用して、ACLが不要であることを確認したら削除してください。
5
womble

Apacheのホームフォルダーを確認します(通常は/var/www)とファイルをこのフォルダの下に置き、最後に必要な権限を付与します。 php temp uploadフォルダをこれに変更します。これは私のために働いています。

2
user101119

/usr/sbin/apachectl -t -D DUMP_MODULES

すべてのモジュールが有効になっていることを確認してください

あなたが取得する場合

Warning: SuexecUserGroup directive requires SUEXEC wrapper.

解決

このような警告は通常、suexecラッパーに対する無効な権限によって引き起こされます。

# ls -la /usr/sbin/suexec
-rwsr-xr-x 1 root root 12064 2008-04-17 01:15 /usr/sbin/suexec

権限または所有権が上記の例と異なる場合は、次のコマンドを使用して修正します。

# chown root:root  /usr/sbin/suexec
# chmod 4755 /usr/sbin/suexec

この修正後、すべてが大丈夫でした。

1
Vitalijus