web-dev-qa-db-ja.com

PHPディレクトリへの書き込みアクセスを許可するにはどうすればよいですか?

PHPを使用してファイルを作成しようとしていますが、機能しません。私はこれが書き込みアクセスを持っていないためだと仮定しています(以前は常に問題でした)。フォルダーchmod 0777を作成して、これが問題であるかどうかをテストしようとしましたが、そのディレクトリのすべてのスクリプトが500エラーメッセージを返すようになりました。 PHPにファイルシステムへの書き込みアクセス権を付与して、ファイルを作成できるようにするにはどうすればよいですか?

編集:Apacheを使用したHostgator共有ホスティングでホストされます。

編集2:誰かがコードを要求しました:コードはGd画像スクリプトです。それが呼び出されるたびに画像を作成していたので、私はそれの残りが機能することを知っています。今、私は新しいテキストが追加されたときにそれらを作成し、フォルダに保存しようとしています。私が持っている書き込み行は次のとおりです。imagejpeg(null、$ file、85);

また、テストファイルを作成して、破損したスクリプト(主にtizagからコピーされたもの)かどうかを確認します。 http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (私はしない)ここにコードを適切に投稿するかどうか/どのように投稿するかがわかります。ここにPHPスクリプトの内容からPHPタグを除いたものを示します。)

13,13,1(個別の行)を返すため、何かを書いたと思われるように見えますが、testfile.txtは空白(空のファイルをアップロードした)または存在しない(削除した場合)。

編集3:サーバーはCentOSを実行します。

66

簡単な方法は、最初にPHPにディレクトリ自体を作成させることです。

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');

これにより、面倒なアクセス許可が不要になります。

54
favo

ディレクトリの所有者をApacheを実行しているユーザーに設定します。多くの場合、Linuxには誰もいません

chown nobody:nobody <dirname>

これにより、フォルダは誰でも書き込み可能になりませんが、Apacheでも書き込み可能です:)

33
Thomas Winsnes

シンプルな3ステップソリューション

要約:ディレクトリの所有者を、PHPが使用するユーザー(Webサーバーユーザー)に設定する必要があります


ステップ1:PHPユーザーを決定する

次を含むPHPファイルを作成します。

<?php echo `whoami`; ?>

Webサーバーにアップロードします。出力は次のようになります。

www-data

したがって、PHPユーザーはwww-dataです。


ステップ2:ディレクトリの所有者を決定する

次に、コマンドラインを使用してWebディレクトリの詳細を確認します。

ls -dl /var/www/example.com/public_html/example-folder

結果は次のようになります。

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder

したがって、ディレクトリの所有者はexampleuser1です。


ステップ3:ディレクトリ所有者をPHPユーザーに変更

その後、Webディレクトリの所有者をPHPユーザーに変更します。

Sudo chown -R www-data /var/www/example.com/public_html/example-folder

Webディレクトリの所有者が変更されたことを確認します。

ls -dl /var/www/example.com/public_html/example-folder

結果は次のようになります。

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

したがって、example-folderの所有者はPHPユーザーに正常に変更されました:www-data


完了!PHPはディレクトリに書き込むことができるはずです。

11
Grant Miller

次のコマンドを使用して、どのユーザーがhttpdプロセスを所有しているかを最初に把握する

ps aux | grep httpd

次のような複数行の応答が返されます。

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

ここで、最初の列はユーザ​​ー名を示しています。これで、ファイルを書き込もうとしているユーザーがわかりました。この場合はphpuserです。これで、PHPスクリプトが何かを書き込もうとしているディレクトリのアクセス許可を設定できます。

Sudo chown phpuser:phpuser PhpCanWriteHere
Sudo chmod 755 PhpCanWriteHere
8
sowrov

PHPのchmod()を使用して、フォルダーのアクセス許可を変更できます。コマンドの使用方法に関する詳細はこちら: http://php.net/manual/en/function.chmod.php

パーミッションを777(world writable)に設定したときに500エラーが発生した場合、そのようなファイルの実行を防ぐためにサーバーがセットアップされていることを意味します。これはセキュリティ上の理由で行われます。その場合は、ファイルに対する最高のアクセス許可として755を使用します。

PHPドキュメントを実行しているフォルダーに生成されたerror_logファイルがある場合、最後のいくつかのエントリーを表示する必要があります。これにより、スクリプトが失敗している場所がわかります。

PHPファイル操作のヘルプについては、リソースとして http://www.tizag.com/phpT/filewrite.php を使用します。

4
Ryan Gyure

HostGatorでは、ファイルをCMOD 644、Foldersを755に設定する必要があることがわかりました。これは技術サポートに基づいて行ったため、HostGatorで動作します

3
BSM

ディレクトリへの書き込みアクセスを許可する最良の方法。

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
3
pritesh

分析するためにselinuxをpermissiveに設定できます。

    # setenforce 0

Selinuxはログに記録しますが、アクセスは許可します。そのため、/var/log/audit/audit.logで詳細を確認できます。 selinuxのコンテキストを変更する必要があるかもしれません。これに注目して、chconコマンドを使用します。必要に応じて、audit.logを提示して、より詳細な回答を入手してください。

問題を解決した後にselinuxを有効にすることを忘れないでください。 selinuxを強制的に維持します。

    # setenforce 1
3
nitishkrs

chmodでは、ファイルの所有権を設定できません。ファイルの所有権を設定するには、chownコマンドを使用する必要があります。

2
user988294

私は同じ問題を抱えていました:

0777をphpディレクトリに渡すことに消極的だったので、権利0777でtmpディレクトリを作成し、書き込み先のファイルを作成します

私のphpディレクトリは引き続き保護されます。誰かがtmpディレクトリをハッキングしても、サイトは通常どおり動作し続けます。

2
Jorge Gutierrez

私はUbuntuを実行していますが、上記のようにnobody:nobodyはUbuntuでは動作しません。エラーが表示されます:

chown: invalid group: 'nobody:nobody'

代わりに、次のように「nogroup」を使用する必要があります。

chown nobody:nogroup <dirname>
1
orjtor