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

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

より明確にするために更新されました。

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

以下は、ほとんどのUnixホストで一般的ですが、ホストに問い合わせて、より制限的な権限が利用可能かどうかを確認できます。PHPがファイル(666)とフォルダ(777)に書き込むことを許可する。 Windows サーバーでは、次のことは適用されませんが、ExpressionEngine でファイルとフォルダーを書き込むことができることを確認する必要があります。これについては、家主に連絡する必要があります。

これが何を意味するのかよく分からない。特定のファイルとフォルダをそれぞれ666と777に変更できます。私は愚かですが、上記はPHPでもこれを行うことを許可する必要があるように聞こえますか?

元の質問:

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

どうすればいいですか?

答え1

ラムとMVの答えを技術的なソリューションに仕上げます。以下はすべてUNIXシリーズシステムにのみ適用されます。

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

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サーバーを返します)


Webサーバーへの許可:有効chmodchown

666または777(間違った文書/チュートリアルでこの種の問題に対して好ましい解決策)を実行すると、魔法のように動作しますが、chmod安全ではありません。 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はあなたを表し、4はwww-dataを表し、0はギターを表し、-rw-r----に翻訳されます)、660に設定(6はあなたを表し、6はwww-dataを表し、0はギターを表し、-rw-rw----に翻訳されます)。古いがエレガントなメカニズムであるファイルモードの詳細については、rahmuの回答を参照してください。

パスワードを操作する必要がないようにするには、次のchmod構文を使用することもできます。

chmod -R g+rw your/folder/

これは、「フォルダに対する読み取りおよび書き込み()権限をグループ()に再帰的にg追加する()」という意味です。+rwyour/folder/-R

90%の場合、これで十分です。


私が好む方法:アクセス制御リスト(ACL)を使う

時には最初の解決策だけでは十分ではありません。私は例を挙げますシンフォニーフレーム大量のデータを記録してキャッシュします。したがって、そのフォルダに対する書き込み権限が必要です。

CLIでSymfonyコンソール(マイユーザーアカウント)とWeb(Webサーバーユーザー)を並べて使用している場合、chmod/メソッドだけでは不十分です。chownSymfonyが権限を変更し続けるため、多くの問題が発生する可能性があります。

この例では、多くのUNIXシステムで権限を管理する高度な方法であるアクセス制御リスト(ACL)を使用しています。

以下は公式のSymfonyドキュメントで提供されるコマンドです(必要に応じてapp/cache変更してください。app/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コマンドが機能していることを確認してください。

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

sudo apt install acl

それ以外の場合は、パーティションのマウント方法を変更する必要がある可能性があるため、オペレーティングシステムのマニュアルに従ってください(Ubuntuのドキュメントはここにあります)。

私たちは:

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

私はこの方法で何か問題、満足、払い戻しを受けたことがありません。

答え2

ファイルの所有者に関係なく、666の権限と777で十分です。最後の数字はすべてシステムのユーザーにアクセス権があります。これが最も簡単な方法ですが、正確な理由のため、確かに最も安全な方法ではありません。

より良い方法

最初に知っておくべきことUnix権限のしくみ。このリンクで私が提供した回答を理解するには、権限が数字に変換される可能性があることに注意してください。

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

その後、Aはchmod 666権限をに変更するのと同じですrw-rw-rw

次に、誰がPHPスクリプトを実行しているかを調べる必要があります。通常、これはWebサーバーを実行しているユーザーです。これを行う方法の例は次のとおりです。(ApacheをWebサーバー名に置き換えることができます。)

スクリプトを実行しているユーザーと言及したファイルの所有者を知ったら、適切な権限を設定できます。書き込み権限(または読み取り権限)を付与します。すべてシステムのユーザーは災害的な結果を招く可能性があります。

答え3

他の多くのPHP Webアプリケーションと同様に、Expression Engineには特定のファイルとディレクトリへの読み取り/書き込みアクセスが必要です。たとえば、EE には、config.php ファイルと Database.php ファイルへの書き込みアクセス権と、ファイルアップロードディレクトリへの書き込みアクセス権が必要です。

ドキュメントによると、ほとんどのサーバーはPHPをmod_phpとして実行し(したがってWebサーバーの権限で実行し)、独自のユーザーを使用してFTP(または同様)を介してファイルをアップロードできるため、これらのファイルとディレクトリは次のようになります。 。権限666(全員が読み書きできる)と777(すべての人が読み書きできる)権限を付与しました。

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

ただし、EEガイドラインによれば、一部はmod_phpを使用せずにfastcgi、suphp、またはその他のバージョンを使用しているため、ホスティングプロバイダに連絡してください。これらのサーバーは自分のユーザーとしてPHPを実行するため、アップロードするすべてのファイルはEEスクリプトで生成されたすべてのファイルだけでなく、PHPで読み書きできます。この場合、PHPがアクセスするファイルとディレクトリに600および700のアクセス権を付与する必要があります。 (PHPランタイムではなく)Webサーバーから直接アクセスする他のファイルには、まだ666および777アクセスが必要です。

関連情報