php_管理_值禁用_函数不工作

php_管理_值禁用_函数不工作,php,security,apache2,Php,Security,Apache2,我正试图在我的apache2配置文件中禁用函数,但由于某种原因它无法工作。我已经验证了其他php_admin_值设置是否正常工作,但它只是忽略了disable_函数 以下是我所拥有的: <Directory "/var/www/testdir/*"> php_admin_value open_basedir "/var/www/testdir" php_admin_value disable_functions "exec,shell_exec" </Directory&g

我正试图在我的apache2配置文件中禁用函数,但由于某种原因它无法工作。我已经验证了其他php_admin_值设置是否正常工作,但它只是忽略了disable_函数

以下是我所拥有的:

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

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

</Directory>

php\u admin\u value open\u basedir“/var/www/testdir”
php_admin_value禁用函数“exec,shell_exec”
open_basedir admin值按预期工作(不能包括“../something”),但它仍将执行
ls-a..
或让我执行
exec('ls-a..',$output);echo$输出就好像禁用函数标志甚至没有设置一样

有关如何解决此问题的任何想法?

只能在php.ini文件中更改:


但是,不能在.htaccess文件中使用。

为了提供所有可以做的事情,我想添加此答案

虽然很遗憾地看到,只有通过
php.ini
才能锁定函数
disable_functions
,但至少还是有办法以某种方式摆脱函数。这就是为什么:

我们希望摆脱
exec
,因此我们创建的代码不希望在内部具有
exec
访问权限。这里我们将调用名称空间
disableFunctionNamespace
,并在其中简单地创建一个空函数,以使(*)访问复杂化


*)虽然调用命名空间内的
exec
函数的简单转储尝试实际上会失败,不幸的是,攻击者只需调用
/exec
而不是
exec
就可以逃出名称空间,从而返回到全局名称空间,从而逃出当前名称空间中
exec
函数的阴影。因此,与某些linux中有时使用的
chroot
方法相比,放弃特权更不完美


事实上,建议使用其他形式禁用函数,甚至更好,如果有办法将函数列入白名单,我们会非常感激,但不太可能,因为php会变得更安全,这确实是不可取的;)

我不同意秋葵。您完全可以从php.ini修改disable_函数。但需要注意的是,您不能覆盖已经定义的内容。只能将附加到该数组。例如,如果php.ini文件中没有用于禁用函数的内容,则可以附加:

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文件已禁用say popen,则无法使用php_admin_值覆盖它

我在PHP5.5.9上玩了一会儿,试图弄清问题的根源。我尝试为disable_函数重写一个php值。而phpinfo()在我超车后显示disable_函数行为空。最初在php.ini文件中列出的函数都不可用


作为记录,我的尝试是使用php5 fpm并修改池配置。

正如@john在上面的回答中所说,您只能附加到任何已定义的disable_函数值,而不能删除那些已禁用的函数。由于PHP-FPM设置基值的方式,这一点变得更加复杂。但是,有一个解决方案,由CPanel技术支持社区经理详细说明,为此,我将列出步骤

  • 创建/var/cpanel/ApachePHPFPM目录:

    mkdir/var/cpanel/ApachePHPFPM

  • 创建/var/cpanel/ApachePHPFPM/system\u pool\u defaults.yaml文件:

    touch/var/cpanel/ApachePHPFPM/system\u pool\u defaults.yaml

  • 使用您首选的文本编辑器(例如vi、nano)编辑/var/cpanel/ApachePHPFPM/system_pool_defaults.yaml,使其看起来完全像这样:

    ---
    php_admin_value_disable_函数:{name:'php_admin_value[disable_functions]',值:passthru,system}

    (注意:是的,---行是预期的。在本例中,“passthru,system”被保留为禁用的函数。在该文件中,在该条目之前或之后不存在其他行。)

  • 通过以下方式重新生成PHP-FPM配置文件:

    /scripts/php\u fpm\u config--重建

  • 重新启动Apache PHP-FPM和Apache服务:

    /scripts/restartsrv\u apache\u php\u fpm
    /脚本/重启srv_httpd

  • 此外,请记住,网站上的PHPINFO输出将与您在自定义PHP-FPM配置文件中配置的内容相匹配,尽管其他PHP函数被禁用(这是PHP和PHP-FPM如何工作的产物,而不是如何使用cPanel和WHM实现它们)


    我可以确认,按照上述步骤,我可以删除一个预禁用的函数(shell_exec)

    这是否意味着只有fpm才能解决问题?@Evan你说的“fpm”是什么意思当然,除非有一种按目录禁用函数的方法(“suhosin”似乎是一个选项,但在PHP5.4中不受支持)@Evan您在哪里使用上述指令?我将其放在apache2.conf文件中(通过一个include),这段代码对我不起作用(apache2.4,PHP5.6)
    php\u admin\u值[禁用函数]
    是一个解析错误。我可以做以下事情:
    php\u admin\u value[disable\u functions]“link,symlink,…”
    ,但它什么也不做。php-FPM有一种非常深奥的方法,允许您覆盖disable\u函数,我将添加它作为答案。很棒的描述@Rich。
    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