php 會話 - 是否可以觸發由不同於 www-data 的使用者執行的伺服器腳本?

php 會話 - 是否可以觸發由不同於 www-data 的使用者執行的伺服器腳本?

我正在 lamp ubuntu 雲端伺服器(亞馬遜 ec2)上運行 php+mysql 網站。我使用 php 會話。 apache php 使用者稱為 www-data。

對於每個會話(SID),我需要建立一個臨時資料夾,它是 www 的子目錄,並將會話 ID 作為其名稱(不可預測,因此無法預先建立)。例如:/var/www/fileStore/s35S10nT3Mp/。

稍後我將透過 javascript(客戶端)函數存取這些資料夾中的檔案。

我的工作假設是:

  1. php 程式碼執行(或呼叫)的任何內容都將在使用者 www-data 下運行
  2. 用戶端 javascript 無法存取 OUTSIDE www 以外的子目錄(例如:/var/outsideFileStore/s35S10nT3Mp/,其中 webroot = public_html = /var/www)

我很樂意在上述一項或兩項上都錯,因為它會毫不費力地解決我的問題。如果我的任一假設沒有錯的話:

我在 www 的子目錄中授予使用者 www-data 寫入權限(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 調用,上面文件中給出的腳本就應該以上面文件中指定的用戶身份運行。

相關內容