我在 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-data 在 www 子目录中的写入权限(php 对 mkdir 新文件夹所必需的)时遇到了安全问题,因为这会导致这些文件夹中的服务器和数据过于暴露。
我想知道 php 会话是否可以触发(或调用)在另一个用户(将在 /var/www/fileStore/ 中获得写权限)下运行的服务器脚本/进程,而不是 www-data。然后,此过程将创建(并进行垃圾收集)这些临时文件夹。
推论:如果在 apache 下无法完成此操作,tomcat 是否有帮助(如果我在 java 下运行 php 而不是 http_server)?
推论 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;
}
只需make_stats.cgi
从 Apache 调用,上述文件中给出的脚本就应该以上述文件中指定的用户身份运行。