我遇到了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的錯誤?有沒有我沒有考慮到的事情?
「這意味着PHP忽略disable_functions本地值並使用主值。」 - 你確定這並不意味着它附加額外的功能?嘗試爲PATH添加第三個函數,並查看它是否也被禁用。 –
根本沒有意義。爲什麼disable_functions的工作是通過添加和所有其餘的指令工作通過重寫值?無論如何,我只是通過在全局配置中刪除shell_exec來配置本地值= shell_exec PATH部分和主值= exec來完成測試。正如預期的那樣,shell_exec的配置工作,因爲主值現在只阻止執行函數確認本地值被忽略。 –
呵呵,不要問我爲什麼它是有道理的。這是PHP。:-我建議在錯誤跟蹤器中詢問這個問題。也許有一些無證內幕可以解釋這種行爲。事實上,想想它很可能。如果'mod_php'可以根據路徑有條件地禁用某個函數,我會感到驚訝 - 直觀地說,執行它似乎有點血腥。也許嘗試使用本地php.ini文件進行設置,因爲您正在使用fastcgi? –