2013-06-25 75 views
0

我遇到了PHP disable_functions的問題。在運行suPHP FastCGI PHP> 5.3.0的Apache服務器中,我試圖設置每個虛擬主機的disable_functions值。要做到這一點,我正在做的是在suPHP配置中禁用suPHP_ConfigPath來禁止用戶使用他們自己的php.ini文件。然後在全局php.ini文件中,我使用php部分[PATH]指令在特定的虛擬主機上配置自定義的disable_functions。喜歡的東西:disable_functions使用PHP配置時忽略本地值[路徑]部分

php.ini文件

... 
disable_functions = shell_exec, exec 

[PATH=/home/someuser/public_html] 
disable_functions = 
... 

如果我用的phpinfo文件的虛擬主機檢查PHP配置我得到正確的預期值。 Disable_functions指令具有本地值=無值和主值= shell_exec,exec。但是如果我運行一個使用shell_exec的測試腳本,服務器會阻止它顯示一個錯誤,指出由於安全原因已經禁用了shell_exec。這意味着PHP忽略disable_functions本地值並使用主值。

我無法弄清楚爲什麼不能按預期工作,因爲[PATH] [HOST] PHP部分文檔應該可以配置這些部分的禁用功能。對於文檔,只有擴展名和zend_extension指令不應該用在章節中。

我已經測試過其他指令PHP_INI_SYSTEM,甚至只有一個php.ini指令(expose_php),並且都按預期工作。所以我完全迷失了,我無法理解發生了什麼。

爲了完整起見,我已經在運行FastCGI + SuExec PHP> 5.3.0(類似於suPHP但不完全相同)的Apache服務器上進行測試,發生同樣的事情,disable_functions本地值被忽略。

任何人都知道這是行不通的一個很好的理由?它是一個PHP的錯誤?有沒有我沒有考慮到的事情?

+0

「這意味着PHP忽略disable_functions本地值並使用主值。」 - 你確定這並不意味着它附加額外的功能?嘗試爲PATH添加第三個函數,並查看它是否也被禁用。 –

+0

根本沒有意義。爲什麼disable_functions的工作是通過添加和所有其餘的指令工作通過重寫值?無論如何,我只是通過在全局配置中刪除shell_exec來配置本地值= shell_exec PATH部分和主值= exec來完成測試。正如預期的那樣,shell_exec的配置工作,因爲主值現在只阻止執行函數確認本地值被忽略。 –

+0

呵呵,不要問我爲什麼它是有道理的。這是PHP。:-我建議在錯誤跟蹤器中詢問這個問題。也許有一些無證內幕可以解釋這種行爲。事實上,想想它很可能。如果'mod_php'可以根據路徑有條件地禁用某個函數,我會感到驚訝 - 直觀地說,執行它似乎有點血腥。也許嘗試使用本地php.ini文件進行設置,因爲您正在使用fastcgi? –

回答

2

clearly stated in PHP Manualdisable_functions選項只能在主php.ini中進行設置。本地值可以設置,並且可以用phpinfo()顯示,但似乎沒有任何影響(至少在PHP 5.5上)。

爲了解決這個問題,我使用per-vhost auto_prepend_file(或者一個全局的per-vhost子包含)。該腳本包括呼叫uopz_delete()。如果uopz PECL擴展名不適用於您的PHP版本或操作系統等,您可以嘗試其他擴展名,如APDrunkit,因爲它們具有類似的功能來刪除/隱藏其他PHP函數。

帶有uopz的解決方案已經在運行Ubuntu 5.5.5的一些生產服務器上進行了測試。它似乎不會嚴重影響性能,也不會導致任何不穩定。