私があなたの質問を正しく理解していれば、問題は Linux パーミッション/ユーザー フレームワークの構造から始まります。したがって、Apache プロセス所有ユーザーは、スクリプトの実行時にディレクトリとファイルを作成するユーザーです。
スクリプトのユーザー分離が必要な場合、たとえば、サーバー上の異なる (仮想) ホストに異なるディレクトリがあり、あるホストのスクリプトが同じ (apache) サーバー上の別のホストのデータに作用したくない場合、その場合は、より一般的な 'mpm-prefork' Apache の代わりに 'mpm_itk_module' を使用する必要があります。
これを使用して、スクリプトを実行するときにApacheが使用しているユーザー/グループを定義できます。このコマンドだけで、httpd.conf 内の仮想ホスト エントリごとにディレクトリを作成します:
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
1 つのスクリプトの実行で本当に別のディレクトリを作成したい場合は、Apache プロセスを root.root が所有する必要があり、スクリプトは各ディレクトリの権限と所有者を希望どおりに設定する必要があります。
しかし、Web サーバー上で最高のスクリプトを root として実行することは決して良い考えではありません。リスクを考慮していない可能性があるからです。
私の見解では、仮想ホストによるユーザー/権限の分離は、はるかに節約的な方法のようです.
別のポイント - PHP のみ - suPHP -> http://www.suphp.org
編集:
わかりました、私はあなたのサイトを見ました。私はスペイン語を話すことができませんが、あなたのウェブサイトは 1 つだけのようで、このウェブページを常に訪れているさまざまなユーザーに対応しているようです。では、Linux ファイルシステムのパーミッションでユーザーを分離する必要があるのはどこでしょうか?ファイルシステムのユーザーを必要とせずに、アプリケーションによってすべてを制限できます。あなたが与えたとしても追加の ftp アクセス - 制限します。 proftpd を使用すると、さまざまなユーザー用に独自の chroot メカニズムがあります。
誰が何を実行しているかを制御できない場合にのみ、ファイルシステムの権利を気にする必要があります。これは、前述の mpm_itk_module で解決できるマルチドメイン ホストでの一般的な問題です。
あなたの状況をもう少し説明した方がいいでしょうか?
編集 2:
コメントで示唆されているように、アップロード/操作のためにユーザーにファイルへのアクセスを許可するために apache のみを使用する場合は、ファイルを apache の documentroot ツリーの外 (!) に配置し、単純なデータベースを作成して、どのファイルがどの所有者であるかを確認します。ユーザー:
user a | file parentdir/filename
これは簡単な表であり、あなたの php コードはデータベースからユーザーにどのファイルを表示/操作できるかのリストを提供し、あなたのコードはユーザー アクションによって意図されたとおりに動作します。
ユーザーに他のサービス (ftp、ssh など) によるファイルへのアクセスを許可しない限り、Linux ユーザー権限で作業する必要はまったくありません。ファイルをサーバーのドキュメント ルートの外に配置するように注意してください。これにより、サーバーの apache ユーザーの権限によって、php コードのみがファイルにアクセスできるようになります。
編集 3:
ははは、あなたの同様の投稿を読んだ後、ようやくあなたの問題が発生しました:(Apache ユーザーは、アクセス許可を持っているときにファイルを書き込むことができますか?) この場合 (あなたの Web ページに本当に匿名のユーザーがいる場合)、これをぜんぶ解決。すべての訪問者は、認証なしで同一の訪問者として扱われます。そして、前回の編集で想定し、同様の投稿でコメントしたように、Linux ファイルのアクセス許可を処理する必要はまったくありません。
あなたの解決策;) :ユーザーがページにアクセスしている間に、セッション ID を使用して 1 つのセッションでファイル操作を行う必要があります。したがって、コードでは、訪問者 (セッション ID) と、このセッション ID でアップロードされたファイルとの関係を処理する必要があります。これを行うには、訪問者がオンラインである限り有効なセッション ID を使用するのが最善の方法です。繰り返しますが、ファイルシステムのパーミッションは必要ありません....;)
2 番目の方法は、前に提案したように、認証されたユーザーを使用する方法です。Web ページ (サーバーではなく) にログインするためのユーザー/パスワードを含む db テーブルと、ユーザー/ファイルの関係を保持する別のテーブルを作成します。ウェブページにログインした後、セッションを再度操作して、ユーザーが既にアップロードされたファイルにアクセス/操作できるようにします。
mod_php で apache を実行できます。したがって、PHP インスタンスは apache インスタンスの下で動作し、apache USER と GROUP を持つことを意味します。フォルダーを作成し、このフォルダーの所有者を変更できますが、所有者はシステム内のユーザーでなければなりません (apache または同じ仮想ユーザーではありません)。
ただし、「.permitions」などのすべてのディレクトリファイルに保存し、そのファイルに仮想所有者を入れることができます。次に、このディレクトリへのすべての書き込み (削除、名前変更など) の試行をフィルター処理し、仮想ユーザーと .permitions ファイルに保存されているユーザーを比較する必要があります。
サンプル クラス (完全ではありませんが、アイデアを理解するには十分です):
class UserDirs {
private $path='/home/vusers';
public function mkdir($user){
$d = $this->path.'/'.md5($user);
mkdir($d);
file_put_contents($d."/.owner",$user);
}
public function checkOwner($user, $dirname){
$f = $dirname."/.owner";
$virtual_owner = file_get_contents($f);
return $user === $virtual_owner;
}
}
$d = new UserDirs()
$d->mkdir("foo","bar");
echo $d->checkOwner("foo1","bar") === true ? "OK":"FAIL";
echo $d->checkOwner("foo","bar") === true ? "OK":"FAIL";
UserDirs を操作するために必要なものをすべてこのクラスにカプセル化し、要件に応じてクラスを拡張できます。
ユーザーはシステム アカウントを持っていません。これらのアカウントを作成することもおそらく不可能です。したがって、これらすべてを Web UI で管理することをお勧めします。
そのままディレクトリを作成し続けます。権限は問題ありません。ただし、そのユーザーのディレクトリまたはファイルのみを表示するように、ユーザー インターフェイスを変更する必要があります。このページに関連付けられたデータベースがあるとします。ユーザー名とランダムに生成されたディレクトリ名をユーザーに関連付けます。誰かがダイレクト パスにアクセスしようとしたときに、そのディレクトリに関連付けられたユーザーでない場合は、ログイン画面に戻ります。
例として、test
という名前のアカウントを作成しました。 おそらく一意のディレクトリが与えられました。ログアウトすると、そのディレクトリにアクセスできないはずです。なぜなら、あなたのコードは
- ログインしていないため、そのディレクトリにアクセスできません
test2
としてログインした場合 test
のディレクトリにアクセスします 、あなたのコードはそれを見るはずです
- 私はアクセスしているディレクトリの所有者ではないため、必要に応じてリダイレクトする必要があります。
ユーザーがアクセスしているディレクトリをチェックし、それをユーザーに関連付けられたディレクトリと比較する関数を追加する必要があります。 2 つが一致する場合は、続行を許可します。一致しない場合は、ユーザーをリダイレクトします。