2011-10-10 64 views
4

抓住這一點,我的頭似乎很基礎。通過PHP/Apache編寫的文件不尊重目錄setgid位

我有一個基於PHP的內容管理系統爲我們的網站編寫的承包商。其中一項功能是能夠上傳要在網站各個位置顯示的圖像(如產品庫)。所有這些上傳的圖像都存儲在一個名爲「附件」的特定目錄中。

drwxrwsr-X 4 WWW ftpusers中4096 10月10日14:47附件

正如你可以看到我已經得到了setgid位上DIR設置,以便將寫入任何文件都會有一羣用戶(如FTP用戶)誰需要訪問這些文件將能夠修改/覆蓋它們。我已經爲Apache設置了umask,以便將文件寫入羣組可寫。

當我嘗試這與創建在該目錄中的新文件系統中的任何用戶,它正確地繼承了集團母公司。當通過在Apache中運行的PHP創建新文件時,它始終擁有apache.apache所有權。 Apache似乎忽略了setgid位,我認爲它不能完成,因爲這是由文件系統完成的。下面是一個文件I上傳:

-rw-RW-R-- 1阿帕奇阿帕奇30536 10月10日14時43分209

我無法測試作爲apache用戶直接,因爲它不具有登錄shell指定(出於明顯的安全原因)。

我可以通過添加ftpusers中組到Apache組獲得相同的權限功能,但這似乎從安全角度來看並不明智。

我確實發現了一件似乎可能與之相關的東西 - 我已經驗證的php安全模式已關閉/etc/php.ini,雖然我不積極,但我發現了php.ini文件Apache中的mod_php正在使用。 php腳本使用move_uploaded_file();據我所知,沒有什麼花哨的權限是在PHP代碼中完成的。

我最好的猜測是,這是出於安全的故意限制,但我無法找到任何東西,似乎表明,是這種情況。

使用Apache 2.2.17和php 5.2.16運行CentOS 5.6。

任何人都有線索?

+0

之前問過那個問題,建議是使用move_uploaded_file()手動複製文件。請參閱http://stackoverflow.com/questions/6232759/phps-move-uploaded-file-does-not-respect-setgid –

回答

2

當您上傳它由PHP的「upload_tmp_dir」設置中指定的目錄中創建的文件。然後move_uploaded_file()將它移動到你的目標目錄。它在創建時保留給它的權限,而不是你將文件移動到的目標目錄的權限。

所以,你要的TMP目錄有你想要的權限,基本上那些你已經給你的目標目錄。然後它將會在setgid有效的情況下創建,並且移動會保留它們。

IIRC「upload_tmp_dir」是不是在.htaccess可用,因此,如果您不能更改此設置或給予目錄,那麼你將需要做的是另一種方式的權限。

+0

不,這沒有幫助。我的upload_tmp_dir有正確的setgid(用戶作爲組),但上傳的文件所有權仍然是apache:apache – wlf

+0

有趣的答案,但在php 7.0和FPM都不適用於我。 –