2010-02-18 60 views
4

我很明顯在Linux上。 PHP腳本似乎在'www-data'用戶下運行。我還可以看到上傳的文件最終在默認的/ tmp目錄中,每個都有一個名稱前綴爲「php」的名稱。所有的標準,我猜。所有這些文件的權限是-rw -------,即600,用戶'www-data',組'www-data'。問題是我有一個Postgresql數據庫服務器在用戶'postgres'下運行,它需要能夠讀取這些文件,因爲它將其內容插入到數據庫中。目前它顯然不能。當然,作爲一項規則,數據庫查詢和功能下誰的用戶連接到數據庫(我連接爲「WWW的數據」,以及),但在這裏我們談論的是已被調用爲「Postgres的服務器端功能操作。這是PostgresQL的限制,無論好壞。如何在/ tmp中覆蓋Apache/PHP存儲的文件的默認權限?

我認爲在考慮到安全性,但是我認爲世界不會下如果我允許或者Postgres的讀取這些文件,或放寬這些文件的權限去。

我如何控制這些文件與創建的權限?顯然,PHP自己創建它們,例如POST文件上傳,但我找不到任何配置開關。另外,我的/ tmp的權限爲'drwxrwxrwt'(777),屬於用戶'root',組'root'。

我試圖改變與「php_value upload_tmp_dir」上傳目錄,但它沒有任何效果,似乎 - PHP仍然存儲在/ tmp中的臨時文件。

我不想與'move_uploaded_file'或'chmod'一起使用,因爲它們寫入文件系統,我想避免這種情況,除了數據庫服務器插入記錄之外。

回答

6

你可以嘗試在/ etc/apache2的/ envvars中

我沒有試過,但它加入到我的envvars中的文件,它看起來像這樣改變的umask設置爲Apache:

# envvars - default environment variables for apache2ctl 

# Since there is no sane way to get the parsed apache2 config in scripts, some 
# settings are defined via environment variables and then used in apache2ctl, 
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc. 
export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data 
export APACHE_PID_FILE=/var/run/apache2.pid 

## The locale used by some modules like mod_dav 
export LANG=C 
## Uncomment the following line to use the system default locale instead: 
#. /etc/default/locale 

export LANG 

umask 022 

據我所知,這將使Apache創建權限爲644的文件。rw -r - r--

+1

您也可以從PHP調用umask()。 – nos 2010-02-18 15:02:27

+0

至於阿帕奇envvars中,好了,我不希望覆蓋所有文件的默認權限apache的創造,只爲那些在PHP上傳目錄(通常是/ tmp)創建的。 P.S. umask()不是線程安全的。 – amn 2010-02-18 19:53:27

+1

好,從外觀上來看,你是唯一的選項是:在PHP 2)的umask在envvars中 3)CHMOD()文件 4)move_uploaded_file()以 我想說 1)的umask()在這些選擇中,chmod是最好的選擇。你必須做一些會影響你的文件系統的事情,因爲沒有辦法設置一個目錄對其中的所有內容都有默認權限。 – Tarka 2010-02-18 21:25:38

1

後上傳你的腳本更改爲chmod()文件?

+0

是的,那將是一個選項。但是我已經編輯了我的問題,我忘記說明我正在嘗試避免在腳本中對文件系統進行更改,這是出於性能和複雜性原因。 – amn 2010-02-18 14:31:30