2013-10-20 33 views
4

我試圖禁用函數,在我的apache2配置文件,但它不工作的原因。我已經驗證,其他php_admin_value設置是工作,但它只是忽略disable_functions選項php_admin_value disable_functions不工作

這是我有:

<Directory "/var/www/testdir/*"> 

php_admin_value open_basedir "/var/www/testdir" 
php_admin_value disable_functions "exec,shell_exec" 

</Directory> 

的open_basedir的管理值按預期工作(不包括「../something」)但是,它仍然可以執行ls -a ..或讓我exec('ls -a ..', $output); echo $output;就好像disable_functions標誌沒有設置一樣。

有關如何解決此問題的任何想法?

回答

6

disable_functions只能在的php.ini文件中改變:

Name    Default Changeable   Changelog 
disable_functions ""  PHP_INI_SYSTEM only Available since PHP 4.0.1. 

然而,php_admin_value不能在.htaccess文件使用。

+0

這是否意味着唯一的方法去做事是用fpm? – Eva

+0

@Evan你是什麼意思的「fpm」? – Gumbo

+0

http://www.php.net/manual/en/install.fpm.php - 除非當然有一種通過目錄禁用函數的方法(「suhosin」似乎是一個選項,但在PHP5.4中不受支持) – Eva

1

爲了提供所有可以完成的工作,我想添加此答案。

雖然看到只能通過php.ini鎖定功能disable_functions,但仍然有辦法至少以某種方式擺脫該功能。這就是:

我們要擺脫exec因此,我們創造我們的代碼,我們希望不會有namespace內的容易訪問exec。在這裏,我們將調用名稱空間disableFunctionNamespace,並在裏面我們將簡單地創建一個空函數,我們想要使(*)訪問複雜化。

<?php 
namespace disableFunctionNamespace; 
function exec(){}; 

//here the code which should not be easily(*) able to call the exec function 
exec("rm /* -rf"); 

?> 

*)雖然容易,轉儲試圖調用的命名空間實際上會失敗的內部exec功能可按,攻擊者可不幸的是通過簡單地調用/exec,而不是exec因此又回到了全局命名空間逃脫命名空間和通過這逃避當前命名空間中的exec函數的陰影。因此,在某些linux中有時會使用chroot的方法,這是一個不太完美的嘗試。

Surrely建議使用一些其他形式的禁用功能或更好,甚至,如果有一種方法來白名單功能,將不勝感激,但不太可能,因爲PHP將變得更加安全,這確實不能期望;)

1

我不贊同Gumbo。你一定可以從php.ini中修改disable_function。但是警告是你不能覆蓋已經定義的內容。您只能將附加到到該陣列。例如,如果你的php.ini文件有沒有爲disable_functions選項,你可以添加:

php_admin_value[disable_functions] = link,symlink,popen,exec,system,shell_exec,show_source,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority 

的是,另一面是,如果你的php.ini文件已經說popen方法禁用,你不能利用其覆蓋的php_admin_value。

我玩這個有點嘗試在PHP 5.5.9到底的問題。我試着覆蓋disable_function的php值。而phpinfo()在我的覆蓋之後將disable_function行顯示爲空。沒有任何最初在php中列出的功能。ini文件可用。

爲了記錄,我的嘗試是使用php5-fpm並修改了池配置。

+0

此代碼不適用於我(Apache 2.4,PHP 5.6)。 'php_admin_value [disable_functions]'是一個解析錯誤。我可以這樣做:'php_admin_value [disable_functions]「鏈接,符號鏈接,...」',但它什麼都不做。 –