
私は LAMP Ubuntu クラウド サーバー (Amazon EC2) で PHP+MySQL サイトを実行しています。PHP セッションを使用します。Apache PHP ユーザーは www-data と呼ばれます。
すべてのセッション (SID) に対して、www のサブディレクトリであり、名前としてセッション ID を持つ一時フォルダーを作成する必要があります (予測不可能なため、事前に作成することはできません)。例: /var/www/fileStore/s35S10nT3Mp/。
後で、JavaScript (クライアント側) 関数からこれらのフォルダー内のファイルにアクセスします。
私は以下の仮定のもとで作業しています:
- PHPコードによって実行(または呼び出され)されるものはすべて、ユーザーwww-dataの下で実行されます。
- クライアント側の JavaScript は、www の外側のサブディレクトリにアクセスできません (例: /var/outsideFileStore/s35S10nT3Mp/、webroot = public_html = /var/www)
上記のどちらか、または両方が間違っていたらうれしいです。そうすれば、これ以上の苦労なく問題が解決するからです。私の仮定のいずれかが間違っていない場合は、次のようになります。
ユーザーに www のサブディレクトリ内の www-data 書き込み権限 (php が新しいフォルダを mkdir するために必要) を与えると、サーバーとこれらのフォルダ内のデータが露出してしまうため、セキュリティ上の問題があります。
PHP セッションが、www-data ではなく、別のユーザー (/var/www/fileStore/ への書き込み権限を受け取る) の下で実行されるサーバー スクリプト/プロセスをトリガー (または呼び出す) できるかどうかを知りたいです。このプロセスは、これらの一時フォルダーを作成 (およびガベージ コレクション) します。
結論: これを Apache で実行できない場合、Tomcat が役立ちますか (http_server ではなく Java で PHP を実行した場合)?
帰結 2: ソケット接続 (PHP 内から) をソケット サーバー (C++ で作成) に実行し、ソケット サーバー (明らかに別のユーザー) にファイル作成を行わせたらどうなるでしょうか。これはやりすぎでしょうか。
答え1
使用できますsetuid()
別のユーザーとしてスクリプトなどを実行する機能。
www-data
以下のラッパー スクリプトを使用して、Apache Web サーバー上で特定の目的とは異なるユーザーとして別のスクリプトを実行します。
suid_wrapper.c
:
#include <stdlib.h>
/*
* C wrapper to run script as other user from Apache.
*
* Instructions:
* Run as root:
* gcc suid_wrapper.c -o make_stats.cgi
* chmod a+s make_stats.cgi
*/
// User ID and Group ID for wanted user.
int uid = 503;
int gid = 506;
// Path to script to be executed as above user.
const char* scriptpath = "/home/user/public/stats/make_stats.sh";
int main()
{
// setgid() must be before setuid(); otherwise one has forsaken the privilege to change group.
setgid(gid);
setuid(uid);
system(scriptpath);
return 0;
}
Apache から呼び出すだけmake_stats.cgi
で、上記のファイルで指定されたスクリプトが、上記のファイルで指定されたユーザーとして実行されます。