php 会话 - 是否有可能触发由与 www-data 不同的用户执行的服务器脚本?

php 会话 - 是否有可能触发由与 www-data 不同的用户执行的服务器脚本?

我在 lamp ubuntu 云服务器(amazon ec2)上运行一个 php+mysql 站点。我使用 php 会话。apache php 用户称为 www-data。

对于每个会话(SID),我都需要创建一个临时文件夹,它是 www 的子目录,并以会话 ID 作为其名称(不可预测,因此无法预先创建)。例如:/var/www/fileStore/s35S10nT3Mp/。

我稍后将通过 javascript(客户端)函数访问这些文件夹中的文件。

我基于以下假设进行工作:

  1. php 代码执行(或调用)的任何内容都将在用户 www-data 下运行
  2. 客户端 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-dataApache 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 调用,上述文件中给出的脚本就应该以上述文件中指定的用户身份运行。

相关内容