2013-01-11 214 views
0

我有FreeBSD 8.0,Apache 2.2.23和PHP 5.4.10的服務器。這是我的VirtualHost配置:如何強制PHP設置文件上傳的正確權限?

<VirtualHost *> 
    ServerName site.com 
    ServerAlias www.site.com 
    DocumentRoot /usr/home/site/pub/htdocs/ 
    php_admin_value open_basedir /usr/home/site/ 
    php_admin_value session.save_path 0;0660;/usr/home/site/pub/tmp/ 
    php_admin_value upload_tmp_dir /usr/home/site/pub/tmp/ 
</VirtualHost> 

/usr/home/site/pub/tmp /由網站擁有:www擁有4770權限。會話文件正確創建(660和site:www)。但上傳的臨時文件使用600的權限創建。所以,因爲網站擁有的這個臨時文件:www和從www:www,move_uploaded_file()運行的Apache無法移動文件。

如何解決?

我認爲我需要在此tmp文件上爲強制設置權限提供補丁PHP。但是哪裏? PHP中的哪些內部函數可以做到這一點?

+1

http://php.net/chmod? –

+0

這個功能不能幫忙,因爲網站擁有的文件:www與600和www從www運行。 – BArtWell

回答

0

我找到了修復它的方法。這是我的補丁代碼:

*** main/php_open_temporary_file.c.orig 2013-01-11 20:33:42.000000000 +0400 
--- main/php_open_temporary_file.c 2013-01-11 21:17:44.000000000 +0400 
*************** 
*** 101,113 **** 
    char cwd[MAXPATHLEN]; 
    cwd_state new_state; 
    int fd = -1; 
! #ifndef HAVE_MKSTEMP 
! int open_flags = O_CREAT | O_TRUNC | O_RDWR 
! #ifdef PHP_WIN32 
!  | _O_BINARY 
! #endif 
!  ; 
! #endif 

    if (!path || !path[0]) { 
     return -1; 
--- 101,107 ---- 
    char cwd[MAXPATHLEN]; 
    cwd_state new_state; 
    int fd = -1; 
! int open_flags = O_CREAT | O_TRUNC | O_RDWR; 

    if (!path || !path[0]) { 
     return -1; 
*************** 
*** 144,169 **** 
     return -1; 
    } 

- #ifdef PHP_WIN32 
- 
- if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) { 
-  /* Some versions of windows set the temp file to be read-only, 
-  * which means that opening it will fail... */ 
-  if (VCWD_CHMOD(opened_path, 0600)) { 
-   efree(opened_path); 
-   free(new_state.cwd); 
-   return -1; 
-  } 
-  fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600); 
- } 
- 
- #elif defined(HAVE_MKSTEMP) 
- fd = mkstemp(opened_path); 
- #else 
    if (mktemp(opened_path)) { 
!  fd = VCWD_OPEN(opened_path, open_flags); 
    } 
- #endif 

    if (fd == -1 || !opened_path_p) { 
     efree(opened_path); 
--- 138,146 ---- 
     return -1; 
    } 

    if (mktemp(opened_path)) { 
!  fd = VCWD_OPEN_MODE(opened_path, open_flags, 0660); 
    } 

    if (fd == -1 || !opened_path_p) { 
     efree(opened_path); 

現在它工作正常,但顯示警告「警告:move_uploaded_file()以:操作上線111 /path/to/script.php不允許」。如何抑制這個警告 - 我不知道。

0

創建文件,然後設置權限將工作。

chmod("/somedir/yourfile", 0644); 
+0

此功能不能幫助,因爲網站擁有的文件:www與600和從www:www運行的Apache。 – BArtWell

0

不要downvote誰告訴你使用chmod()因爲那是唯一的解決辦法從PHP更改文件權限peole。然而,主要的問題似乎是,Apache使用與腳本運行不同的uid創建文件[不可能是AFAIK],或者您嘗試修改使用不同進程運行的文件作爲不同的用戶。

只有文件的所有者可以更改文件的權限/所有權,並且除非單獨的進程專門將所有權轉移給另一個uid,否則該文件的所有者就是創建它的uid。

再次,chmod()chown()是僅有的兩個方法,通過它可以更改權限和所有權,並且等同於通過exec()發出shell命令。

+0

我很抱歉,但那不是我的倒退。你是對的。但會話文件創建正確。所以,PHP可以設置權限強制。現在我想我必須修補php_open_temporary_file.c。 – BArtWell

0

試着看一下chown您可以臨時更改文件的所有者,所以你可以進行適當修改:

$File = '/path/to/file'; 
chown($File, USERNAMEPHPISRUNNIGNAT); 
chmod($File, 0644); 
// Makes Appropriate changes To Files 
chown($File, originalowner); 
// Changes your file back to it's original owner 

想找出用戶名PHP運行爲:

echo exec('whoami');

以上將返回哪個php運行的用戶。