1

我遇到了 PHP disable_functions 的问题。在运行 suPHP FastCGI PHP > 5.3.0 的 Apache 服务器中,我试图为每个虚拟主机设置 disable_functions 值。为此,我正在做的是在 suPHP 配置中禁用使用 suPHP_ConfigPath 来禁止用户使用他们自己的 php.ini 文件。然后在全局 php.ini 文件中,我使用 php 部分 [PATH] 指令在特定虚拟主机上配置自定义 disable_functions。就像是:

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 部分文档应该可以在这些部分上配置禁用功能。只有 extension 和 zend_extension 指令不应在文档部分使用。

我已经用其他指令 PHP_INI_SYSTEM 甚至是一个 php.ini 唯一指令(expose_php)进行了测试,并且都按预期工作。所以我完全迷失了,我无法理解发生了什么。

只是为了完整性,我在运行 FastCGI + SuExec PHP > 5.3.0(与 suPHP 的配置相似但不完全相同)的 Apache 服务器中进行了测试,并且发生了同样的事情,disable_functions 本地值被忽略。

任何人都知道为什么这不起作用的充分理由?它是一个PHP错误吗?有什么我没有考虑到的吗?

4

1 回答 1

2

PHP手册中明确说明disable_functions只能在主php.ini中设置。本地值可以通过 phpinfo() 设置并可见,但似乎没有任何效果(至少在 PHP 5.5 上)。

为了解决这个问题,我使用 per-vhost auto_prepend_file(或一个具有 per-vhost 子包含的全局)。该脚本包括调用uopz_delete()。如果uopz PECL 扩展不适用于您的 PHP 版本或操作系统等,您可以尝试其他扩展,如APDrunkit,因为它们具有删除/隐藏其他 PHP 函数的类似功能。

使用 uopz 的解决方案已经在一些运行 Ubuntu 和 PHP 5.5.9 的生产服务器上进行了测试。它似乎不会严重影响性能,也不会导致任何不稳定。

于 2015-02-13T18:20:46.797 回答