web-dev-qa-db-ja.com

PHPファイルとフォルダへの書き込み許可を与える

さらに明確に更新:

http://expressionengine.com/user_guide/installation/installation.html によると、それは言う:

ほとんどのUnixホストの場合、以下が一般的ですが、より制限の厳しい権限を使用してallow PHP to write to files (666)およびフォルダー(777)。Windowsサーバーでは、以下は適用されませんが、ファイルおよびフォルダーがExpressionEngineによって書き込み可能であることを確認する必要があります。ホストに連絡する必要がある場合があります。このため。

これが何を意味するのかわかりません。特定のファイルとフォルダーをそれぞれ私が管理者である666と777に変更できますが、上記のようにPHPを許可する必要がありますか?

元の質問:

PHPが特定のファイル(666)およびフォルダー(777)に書き込むことができることを確認する必要があります。

どうすればよいですか?

13
oshirowanen

私はrahmuとMVの答えを技術的な解決策で完成させます。以下はすべて、UNIXライクなシステムにのみ有効です。

ACLを使用した例については、chmod/chownセクションを超えてスクロールしてください。これは、UNIXファイルモードよりも強力なツールです。

Webサーバーのユーザー名を見つける

まず、Webサーバーが実行されているユーザー名を知る必要があります。 Apacheを使用している場合、Apacheまたはhttpdwww-dataなどになります。ほとんどのDebianのようなシステムでは、Apacheはwww-dataです。 nginxの場合、一般的にはwww-dataでもあります。

確認するには、次のことを試してください。

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

このコマンドが返すユーザー名が一貫していることを確認してください(たとえば、私はnginxを99%使用しますが、このコマンドはTomcat7を返しますJavaインストールしたWebサーバー1回)


Webサーバーに権限を与える:chmodchownを使用する

chmodを666または777(悪いドキュメント/チュートリアルのその種の問題の頼りになる解決策)にすると、魔法のように動作しますが、安全ではありません。 666または777権限を付与すると、「その他」へのアクセス権が付与されます。したがって、Apacheだけでなくgrandmothernsaも使用します(これらのユーザーアカウントがマシンに存在する場合-ただし、テスト/トラブルシューティング以外の目的で使用しないでください)。

より具体的にして、自分とApacheだけに権限を与える方が良いでしょう。ファイルのグループを変更して、ファイルのフルコントロールをWebサーバーに付与します。これを行うには、所有者を再帰的に変更します。

chown -R www-data:www-data your/folder/

しかし、ほとんどの場合、グループのみを変更することにより、ファイルへのフルアクセスを維持することができます。

chown -R yourusername:www-data your/folder/

次に、適切なchmodを実行して、グループにwww-dataと同じ権限を付与します。たとえば、現在のモードが640 (6つはwww、4つはwww-data、0つはその他、-rw-r -----に変換)の場合、660に設定します- (6はあなた、6はwww-data、0はその他、-rw-rw ----に変換)。ファイルモードの詳細については、rahmuの回答を参照してください。これは古くてエレガントなメカニズムです。

chmodで難解な数字を操作しないようにするには、次の構文も使用できます。

chmod -R g+rw your/folder/

これは、「グループ(g)に追加(+)読み取りと書き込み(rw)権限をフォルダーyour/folder/に再帰的に追加(-R )」.

ケースの90%では、これで十分です。


私の優先する方法:ACL(アクセス制御リスト)の使用

最初の解決策では不十分な場合があります。大量のデータをログに記録してキャッシュする Symfony Framework の例を取り上げます。したがって、適切なフォルダへの書き込みアクセス権が必要です。

また、chmod/chownメソッドは、SymfonyコンソールをCLI(私のユーザーアカウントの下)とWeb(Webサーバーユーザー)で並行して使用している場合、十分でない場合があります。 symfonyは常にパーミッションを変更しているので、これは多くの問題を引き起こします。

この場合、多くのUNIXシステムでアクセス許可を管理するためのより高度な方法であるACL(アクセス制御リスト)を使用します。

ここで、公式のSymfonyのドキュメントで提供されているコマンド(_app/cacheapp/logsを必要に応じて変更してください):

chmod +aをサポートするシステム(つまり、Debian/Ubuntuではない)

Sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
Sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

chmod +aをサポートしないシステム(最も一般的)

setfaclツールが必要です。デフォルトでシステムにインストールされている可能性があるため、setfacl -vを試して、コマンドが使用可能かどうかを確認してください。

コマンドが利用できない場合、and Ubuntu 14.04+を使用している場合は、ツールをインストールするだけです。

Sudo apt install acl

それ以外の場合は、パーティションのマウント方法を変更する必要がある場合があるため、OSのドキュメントに従ってください( buntuのドキュメント )。

そして私たちはそこにいます:

Sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
Sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

私はこの方法で問題を抱えたことはありませんでした。

ファイルの所有者が誰であっても、666のアクセス許可と777で十分です。最後の数字は、システムのeveryユーザーがアクセスできることを確認します。これが最も簡単な方法ですが、そのため、間違いなく最も安全ではありません。

それを行うためのより良い方法

最初に理解する必要があるのは nix権限のしくみ です。このリンクで私が出した答えを理解するために、許可は数字に変換できることに注意してください。

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

chmod 666は、権限をrw-rw-rwに変更することと同じです。

次に、PHPスクリプトを実行しているユーザーを特定します。通常、これはWebサーバーを実行しているユーザーです。 これを行う方法の例を示します (ApacheをWebサーバーの名前に置き換えることができます)。

スクリプトを実行しているユーザーと、あなたが言及しているファイルの所有者がわかったら、適切なアクセス許可を設定する必要があります。システムのeveryユーザーに書き込みアクセス(読み取りも含む)を与えると、悲惨な結果になる可能性があることに注意してください。

4
rahmu

式エンジンは、他の多くのPHP Webアプリケーションのように、一部のファイルおよびディレクトリへの読み取り+書き込みアクセスを必要とします。たとえば、EEは、config.phpおよびdatabase.phpファイルへの書き込みアクセスを必要とします。ファイルアップロードディレクトリへの書き込みアクセス。

ドキュメントの説明によると、ほとんどのサーバーはPHPをmod_phpとして実行するため(したがって、Webサーバーの権限で実行します)、おそらくFTP(または同様の)自分のユーザーを使用して、これらのファイルとディレクトリに666(誰でも読み取りと書き込みができる)および777(誰でも読み取り、書き込み、参照できる)のアクセス許可を与える必要があります。

これは最も安全な方法ではありませんが、ホスティングサービスを使用している場合は特に、最も簡単な方法です。

ただし、EEの説明にあるように、mod_phpを使用せずにfastcgi、suphp、または別のバージョンを使用しているホスティングプロバイダーにお問い合わせください。これらのサーバーはPHPを自分のユーザーとして実行するため、アップロードしたすべてのファイルは、PHPおよびEEスクリプトによって作成されたファイルによって、すでに読み取りと書き込みが可能です。 PHPによってアクセスされるファイルとディレクトリの場合、600および700のアクセス権が必要になります。その他のファイルは、PHPランタイム)には、666および777アクセスが必要です)。

0
MV.